RecyclerView 复用与 CheckBox 结合使用导致的问题

来源:互联网 发布:网络最常鼓掌处理方法 编辑:程序博客网 时间:2024/05/29 15:10
     BangNote 中使用了 RecyclerView 来盛放 Note List, 由于 Note List 需要编辑功能,所以里面一定要使用 CheckBox,这就导致了一个经常出现的问题:RecyclerView 复用会导致 CheckBox 的状态混乱,表现为:当条目比较多的时候,选中了上面的 CheckBox 之后,下面的 CheckBox 也会被选中,而滚动到上面之后,上面的选择状态又会消失。
     这可能是一个很经典的问题了,于是我上网搜索了一下,找到很多解决方案,其中比较简单的一种是新建一个 boolean 类型的数组(或 ArrayList ),用来存放 CheckBox 的状态,当 onCheckedChangeListener 被回调的同时也改变数组对应元素的状态,然后在外部也通过数组的状态来设置一下 CheckBox 的选中状态。这看起来是一个很好的解决办法,并且似乎 90% 的人都使用此方法解决了问题。
     然而我试了很多遍,大大小小的微调也有十几次,根本没有解决问题,后来经过测试我发现,当 RecyclerView 将元素滚动到屏幕外面的时候,onCheckedChangeListener 也被回调了,我不知道这是怎么回事,但是这直接导致了,任何通过 onCheckedChangeListener 来监听 CheckBox 状态的方法都是无效的。
     想了想,我决定“曲线救国”,即利用 CheckBox 的点击事件来设置 CheckBox 的状态,而避免使用 onCheckedChangeListener,代码示例如下:

//RecyclerView 的 Adapter
public class MyAdapter extends RecyclerView.Adapter<NoteItemAdapter.ViewHolder> {

     //其他

     static class ViewHolder extends RecyclerView.ViewHolder {
          //ViewHolder
     }

     //其他

@Override
public void onBindViewHolder(final ViewHolder holder, final int position) {
          //设置其他绑定事件

          holder.checkBox.setChecked(stateContainer.getChecked());   
           //stateContainer 中存放 CheckBox 的状态  
holder.checkBox.setOnClickListener(new View.OnClickListener() {
   @Override
   public void onClick(View v) {
         holder.checkBox.setChecked(!stateContainer.getChecked());
          stateContainer.setChecked(holder.checkBox.getChecked());
    }
});
         //设置其他绑定事件
    }
}
     
0 0
原创粉丝点击