更新修改
最近在项目中碰到这个问题,需要记录checkBox选中的项,还包括全选和取消全选,提供一个新的解决办法,原理是一样的;
原理:RecycleView具有复用性,条目中的checkBox的选中状态可能会被复用而导致混乱,如果RecycleView条目中的checkBox都有相应的数据源,刷新的时候每个条目中的checkBox会赋予相应的状态,也就不会发生混乱,相当于适配器将数据源赋给指定的控件一样,那具体怎样建造checkBox的数据源呢,下面介绍方法:
用SparseBooleanArray来存放checkBox的状态,checkBox默认是未选中状态
// 先给其默认值为false
private SparseBooleanArray mCheckStates=new SparseBooleanArray();
SparseBooleanArray是一种可以存放Boolean值的数组,它的index可以是不连续的,在这里特别适用
在开始的时候给每个checkBox设置一个Tag值,方便状态改变时获取指定的checkBox
holder.checkbox_car_select.setTag(position);
监听checkBox的状态变化,并将状态保存到数组中
holder.checkbox_car_select.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
int pos= (int) buttonView.getTag();
mCheckStates.put(pos,isChecked);
if (mListener != null) {
mListener.onCheckedChangeListener(mCheckStates);
}
}
});
最后在加上给checkBox赋予状态的代码
holder.checkbox_car_select.setChecked(mCheckStates.get(position,false));
项目中使用RecycleView时,其中条目中使用了checkbox,在选中时由于holder的复用性,导致checkbox选中出现混乱,下面提供一种解决方案。
下面是项目中使用的示例,需要记录checkbox的选中个数和位置:
/**
* 由于的RecycleView的复用机制导致checkbox的选中事件发生混乱,这里用一个数组flag[position]来记录的选中情况
*/
holder.cb_select.setOnCheckedChangeListener(null);
holder.cb_select.setChecked(flag[position]);
holder.cb_select.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
Log.e("cb_select>>","========"+isChecked);
flag[position] = isChecked;
/**
* 记录checkbox点击的个数及点击的index
*/
if (isChecked){
mPositionList.add(position);
}else {
for (int i = 0; i < mPositionList.size(); i++) {
if (mPositionList.get(i)==position){
mPositionList.remove(i);
}
}
}
Log.e("cb_select>>","mPositionList=="+mPositionList.size());
}
});