写了一个ExpandableList的Adapter,其中有以下代码:
public View getChildView(final int groupPosition, final int childPosition,
boolean isLastNumber, View convertView, ViewGroup parent) {
NumberViewHolder holder;
if(convertView == null) {
convertView = mInflater.inflate(R.layout.find_people_phonelist_item, null);
holder = new NumberViewHolder();
holder.layoutView = (RelativeLayout)convertView.findViewById(R.id.find_people_phonelist_item_layout);
holder.numberView = (TextView)convertView.findViewById(R.id.find_people_phonelist_number);
holder.selectView = (CheckBox)convertView.findViewById(R.id.find_people_phonelist_select);
holder.placeView = (TextView)convertView.findViewById(R.id.find_people_phonelist_place);
holder.bundleView = (TextView)convertView.findViewById(R.id.find_people_phonelist_bundle);
convertView.setTag(holder);
} else {
holder = (NumberViewHolder)convertView.getTag();
}
//set the layout
PeopleToFind person = listData.get(listGroup.get(groupPosition).getPersonNumber());
final String phone = getChild(groupPosition, childPosition);
boolean isChecked = (person.getSelectedPhoneList()).contains(phone);
holder.layoutView.setOnClickListener(设置监听器);
holder.numberView.setText(phone);
holder.placeView.setText(dbUtils.queryLocationCityOfPhone(StringUtils.getLocationSectionFromPhone(phone))); //StringUtils.getLocationSectionFromPhone(phone));
holder.bundleView.setText(StringUtils.getAgentFromPhone(phone));
holder.selectView.setChecked(isChecked);
holder.selectView.setOnClickListener(设置监听器);
return convertView;
}
其中两处需要设置监听器,但是用的是同一份代码,打算复写监听器。
考虑到其中需要用到getView函数内的变量,如何传递变量给监听器类成了一个问题。
在雪哥的提醒下,复写了监听器的构造函数:
class ChildSelectListener implements OnClickListener {
private int groupPosition;
private String phone;
public ChildSelectListener(int groupPosition, String phone) {
this.groupPosition = groupPosition;
this.phone = phone;
}
public void onClick(View v) {
PeopleToFind person = listData.get(listGroup.get(groupPosition).getPersonNumber());
PeopleToFindGroup personGroup = (PeopleToFindGroup) getGroup(groupPosition);
List<String> selectedPhoneList = person.getSelectedPhoneList();
boolean isChecked = person.getSelectedPhoneList().contains(phone);
int selectedNum = 0;
for(int i=0; i < getChildCount(groupPosition); i++) {
//TODO
}
notifyDataSetChanged();
}
}
还可以使用这种方法,用于不同的按钮设定多个按钮下放不同监听函数的简洁版:
OnClickListener listener0 = new OnClickListener() {
public void onClick(View v) {
int buttonid = v.getId();
switch (buttonid) {
case R.id.btn0:
showDialog(DIALOG1);
break;
case R.id.btn1:
showDialog(DIALOG2);
break;
case R.id.btn2:
Intent i2 = new Intent().setClass(test1.this, SQLite.class);
startActivity(i2);
break;
default:
break;
}
}
};