Android RecyclerView item+CheckBox 的复用问题

最近在做一个相册导入的东西,用了RecyclerView 的 Grid 布局,像这样:


图片发自App

其中每个 Item 都带了一个 CheckBox 用于做选中/非选中状态,
本以为一切能按我的想法进行:
创建一个 photoModel 给他们一个bool 值 isSelect 表示是否选中;
当选中一个 item 时修改数据源中对应的 photoModel ,使它的 isSelect = true,
然后 notifyDataSetChanged() 刷新就行了。
运行之后,事与愿违。
选中 item 之后再滑动触发复用,整个列表的选中状态变得乱七八糟,惨不忍睹。

RecyclerView的复用导致了这个问题,那么
如何解决呢

解决方案:

  1. 创建一个用于记录CheckBox状态的List
private List checkBoxTagList;
  1. 在onBindViewHolder方法中为每个CheckBox设置tag,
    并通过checkBoxTagList中保存的状态tag,确定每个CheckBox的选中状态
holder.checkBox.setTag(new Integer(position));
if (checkBoxUserIdList != null) {
  holder.checkBox.setChecked((checkBoxUserIdList.contains(new Integer(position)) ? true : false));
} else {
  holder.checkBox.setChecked(false);
}
  1. 为CheckBox 添加监听setOnCheckedChangeListener,并在onCheckedChanged 中加入如下判断
if (isChecked) {
  if (!checkBoxUserIdList.contains(helper.checkBox.getTag())) {
    checkBoxUserIdList.add(new Integer(helper.getAdapterPosition()));
  }
} else {
  if (checkBoxUserIdList.contains(helper.checkBox.getTag())) {
    checkBoxUserIdList.remove(new Integer(helper.getAdapterPosition()));
   }
}
  1. 在给CheckBox赋值之前,先setOnCheckedChangeListener为null
checkBox.setOnCheckedChangeListener(null);
checkBox.setChecked(item.isSelect());

以上。

你可能感兴趣的:(Android RecyclerView item+CheckBox 的复用问题)