我有一个listView,通过ArrayAdapter填充小的xml子视图。每个小视图只有两个东西,一个复选框和其旁边的字符串标签。
我想设置一个onCheckedChanged监听器来捕获用户勾选或取消勾选复选框的事件。
例如,这里展示了一个监听器:
listView.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) {
Toast.makeText(this, "box has been checked", Toast.LENGTH_SHORT).show();
}
}
监听器代码应该放在你想要监听的事件发生的地方,并且需要设置它。以下是ArrayAdapter的代码:
public class MobileArrayAdapter extends ArrayAdapter<CheckBoxInfo>{
CheckBoxInfo[] objects;
Context context;
int textViewResourceId;
public MobileArrayAdapter(Context context, int textViewResourceId,
CheckBoxInfo[] objects) {
super(context, textViewResourceId, objects);
this.context = context;
this.textViewResourceId = textViewResourceId;
this.objects = objects;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row_layout_view = convertView;
if ((row_layout_view == null)){
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row_layout_view = inflater.inflate(R.layout.row_layout, null);
}
//CheckBoxInfo item = objects.get(position); // for arrayList
CheckBoxInfo item = objects[position];
if(item != null){
TextView textView = (TextView) row_layout_view.findViewById(R.id.textView1);
CheckBox checkBox = (CheckBox) row_layout_view.findViewById(R.id.checkBox1);
if(item !=null){
textView.setText(item.checkBoxName);
checkBox.setChecked(item.checkBoxState);
}
}
return row_layout_view;
}
}
getView()
中更新所有视图及其属性都是必要的,包括设置 CheckBox 值以及它的 OnClickListener。简而言之,在保留监听器的同时,添加checkBox.setChecked()
来将其设置为期望值,以防回收(或新)视图具有不同的设置。 - David Manpearl