我已经实现了一个自定义列表视图,扩展了一个ArrayAdapter类,每当我滚动listview时,我都会遇到这样的问题:复选框项目未经检查,所以我实现了以下代码:
CheckBox cb = (CheckBox) myview.findViewById(R.id.grocery_item_checkbox);
//Code to keep the status of checkbox checked, when scrolling up or down
cb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
if(!compoundButton.isChecked()){
checkbox_status[pos] = false;
Log.d("LOG", "Checkbox at position" + pos + "is set to" + checkbox_status[pos]);
}else{
checkbox_status[pos] = true;
Log.d("LOG", "Checkbox at position" + pos + "is set to" + checkbox_status[pos]);
}
notifyDataSetChanged();
}
});
if(!checkbox_status[pos]){
cb.setChecked(false);
}else{
cb.setChecked(true);
}
这里checkbox_status
是一个布尔数组,用于存储复选框的状态。并且pos
指的是getView方法中的位置。
我遇到的问题是每当我点击列表视图中的顶部项目时,底部项目都会被检查:
说我点击位置0的项目,但是点击位置6的项目。
当我向上或向下滚动时,复选框的状态也会再次受到干扰。
答案 0 :(得分:0)
首先,您正在设置一个侦听器,然后,您正在设置已选中\未选中。它会触发听众。
之后,我不知道您是否使用了视图模式。如果你不这样做,你需要使用它。否则你的问题将继续存在。
在适配器的getView方法中,您应该实现如下:
//in some cases, it will prevent unwanted situations
cb.setOnCheckedChangeListener(null);
if(!checkbox_status[pos]){
cb.setChecked(false);
}else{
cb.setChecked(true);
}
//Code to keep the status of checkbox checked, when scrolling up or down
cb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
if(!compoundButton.isChecked()){
checkbox_status[pos] = false;
Log.d("LOG", "Checkbox at position" + pos + "is set to" + checkbox_status[pos]);
}else{
checkbox_status[pos] = true;
Log.d("LOG", "Checkbox at position" + pos + "is set to" + checkbox_status[pos]);
}
notifyDataSetChanged();
}
});