解决Recyclerview列表中使用CheckBox导致下滑时选中状态混乱

概述

  今天用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

    原文作者:饮水思源为名
    原文地址: https://www.jianshu.com/p/6771405c6c33
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞