问题1
因为checkbox的点击事件优先级高于listview的item点击事件
所以,checkbox点击后,item的事件将不能触发。
、
解决方法:
要想checkbox和item的事件都能触发,只需要在item的跟
布局中添加
android:descendantFocusability="blocksDescendants"
问题2
由于baseAdapter里的getview()方法里的convertview参数可以重用item,
导致你选中一个item里的checkbox后,每隔一定长度的item里的checkbox也会显示选中状态
解决方法:
用一个hashmap记录每个item里checkbox的状态,在每次取出item时,自己根据hashmap里的值
初始化checkbox的状态。
//初始化checkbox的状态值
h.checkBox.setChecked(checkBoxState.get(position));
//用一个hashmap记录checkbox的变化值
h.checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
checkBoxState.put(position, isChecked);
}
});
问题3
item里含有checkbox并且为它设置了setOnCheckedChangeListener事件,每次调用setChecked()这个方法时,会触发这个事件,而很多
时候调用这个方法时你不想让它触发,所以要先把设个事件设置为null
解决方法:
h.checkBox.setOnCheckedChangeListener(null);
h.checkBox.setChecked(checkBoxState.get(position));
h.checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
checkBoxState.put(position, isChecked);
}
});
在初始化checkbox的状态值前,添加h.checkBox.setOnCheckedChangeListener(null);
所以问题2和问题3一般会一起出现,都要一起解决。
public View getView(final int position, View convertView,
ViewGroup parent) {
// TODO Auto-generated method stub
if (convertView == null) {
convertView = getLayoutInflater().from(mainActivity.this)
.inflate(R.layout.itemview, null, false);
h = new hold();
h.nameView = (TextView) convertView
.findViewById(R.id.nameItemTV);
h.noticeButton = (Button) convertView
.findViewById(R.id.ItemnoticeBT);
h.checkBox=(CheckBox) convertView.findViewById(R.id.itemCB);
h.checkBox.setId(position);
// h.editText = (EditText) convertView.findViewById(R.id.itemet);
convertView.setTag(h);
} else {
h = (hold) convertView.getTag();
}
h.checkBox.setOnCheckedChangeListener(null);
h.checkBox.setChecked(checkBoxState.get(position));
h.checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
checkBoxState.put(position, isChecked);
}
});
return convertView;
}