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

     一个安卓项目中使用了 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值