ListView中的CheckBox在单击时检查错误的项目

时间:2015-12-07 14:00:23

标签: android listview

我已经实现了一个自定义列表视图,扩展了一个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的项目。

当我向上或向下滚动时,复选框的状态也会再次受到干扰。

1 个答案:

答案 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();
       }
});