做了一个列表页面,是用Recyclerview 展示数据的,并且其中有一个CheckBox ,作为收藏和取消收藏的按钮,但是当列表滑动后就发现,CheckBox 的状态是混乱的,现在来说一下原因。我们知道Recyclerview 是Recyclerview 会回收使用组件达到优化性能的效果,回收checkbox的时候会触发OnCheckedChangeListener 事件,这就导致checkbox的listener中的逻辑会被打乱。正常情况下我选中了一个CheckBox 滚动后再回来,肯定还是希望是选中状态,可是当View 滚动带着CheckBox 画出可视范围后,RecyclerView是可能回收掉这个Item的,OnCheckedChangeListener事件会被触发,这样相当于自动把我选中的取消了。
解决的方法有两种
- 第一种就是给这个CheckBox 设置一个Tag,每次滚动时设置并且判断上一次的Tag,做出相应的选中取消状态
-第二种就是比较简单的一种了,我们可以在Recyclerview的onBindViewHolder 方法中,先把CheckBox的监听事件置为空,之后再去做相应的点击事件监听
itemLike.setOnCheckedChangeListener(null);
Integer attation = item.isAttation();
itemLike.setChecked(attation == 1 ? true : false);
itemLike.setOnCheckedChangeListener((buttonView, isChecked) -> {
if (isChecked) {
atteation(findId, RequestUrl.ATTENTIONAC, true, getAdapterPosition());
} else {
atteation(findId, RequestUrl.UNATTENTION, false, getAdapterPosition());
}
});
这样的话就可以保证列表在滑动的时候不会导致checkBox的状态混乱
但是,如果后期使用当中,你还是会发现各种混乱的状态的,所以,少年,劝你一开始就使用Imageview 替代checkBox吧,毕竟imageView 是不会掉进坑里的,哈哈。