概述
今天用recyclerview时候发现checkbox重复使用会导致OnCheckedChangeListener 出现一个不太友好的问题,问题是这样的:Recyclerview 会回收使用组件,回收checkbox的时候会触发OnCheckedChangeListener 事件,导致我们写的listener中的逻辑会被打乱。
比如我选中了一个checkbox,那么当view滚动导致这个checkbox 滑动出可视范围的时候 ,OnCheckedChangeListener事件会被触发,这样相当于自动把我选中的取消了。
采用解决方法:
//在初始化checkBox状态和设置状态变化监听事件之前先把状态变化监听事件设置为null
holder.checkBox.setOnCheckedChangeListener(null);
//然后设置CheckBox状态
if(isChecked){
holder.checkbox.setChecked(true);
}else{
holder.checkbox.setChecked(false);
}
//然后设置状态变化监听事件
holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListen
@Override
public void onCheckedChanged(CompoundButton buttonView,boolean isChecked){
if(isChecked){
//...
}else{
//...
}
}
});
分析
1.CheckBox在执行setChecked时会触发OnCheckedChange处理程序;
2.Adapter采用的是控件重用机制,就是当列表往上下拖时,那些被拖出屏幕外的控件会重用,由于该item获取到的数据项(dataList.get(index))往往使用了final,所以在执行CheckBox.setChecked(true/false); 触发该控件的OnCheckedChange处理程序,而这个处理程序指向的数据项是前一次绑定的那行数据,这样就可能导致dataList中的某个数据被意外修改,进而引起程序行为的不确定。
参考文章
https://blog.csdn.net/jdsjlzx/article/details/52426868
https://blog.csdn.net/nerver87/article/details/51291337