RecyclerView中CheckBox显示混乱的解决办法

前言:最近加入了一个团队。独立开发Android端,这对我来说是一个很大的挑战,再以前开发,总有老手带我飙车,很多技术难点和一些第三方工具我都没有接触,现在我必须独自面对这些,但即使是挑战,那就努力面对,慢慢克服。现在这个团队氛围不错,大家都平平等等为了项目的发展默默奉献,没有内耗。大家心中就只有一个念头,将这个项目做好。希望我在这个团队也能得到更多的成长。

现在也没有像以前那么闲,每天有写博客的时间,接下来我会将我在开发中遇到的问题和难点,记录下来,等有空我会将它们理成博客,希望能够为和我一样菜鸟的新手们在开发中少走一些弯路。


RecyclerView和ListView在它们的Item中如果使用了CheckBox的时候,我经常会给checkBox设置OnCheckedChangeListener的监听器,用来监听CheckBox的状态并作出相应的逻辑处理。例如一下代码:

holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if (isChecked){
                    holder.checkBox.setChecked(true);
                    order.setChecked(true);
                }else {
                    holder.checkBox.setChecked(false);
                    order.setChecked(false);
                }
            }
        });

当我们洋洋洒洒的写下以上代码,并进行编译通过的时候,我们以为一切会运行正常。但运行结果却出乎我们意料:

我们选中的CheckBox在下滑以后,再回去发现并没有选中。

关于这个bug的原因其实很简单,我们都知道RecyclerView和ListView都是做到复用的,当我们Debug的时候你会发现,每当我们划动的时候,由于item被复用,checkbox的选中状态会发生改变,每当我们滑动的时候我们的setOnCheckedChangeListener的代码都会被调用。这就是真正造成我们CheckBox状态异常的元凶。

其实想要解决这个bug其实也很简单,我们只要不使用setOnCheckedChangeListener,将监听器改为setOnClickListener就能解决这个问题。

我们改造一下上面的代码:

        holder.checkBox.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                holder.checkBox.setChecked(!order.isChecked());
                order.setChecked(!order.isChecked());
            }
        });
这样我们就发现,我们的CheckBox的状态能够按照我们想要的方式进行正常的显示了。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值