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);
                }
            }
        });

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

RecyclerView中CheckBox显示混乱的解决办法_第1张图片

我们选中的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的状态能够按照我们想要的方式进行正常的显示了。

你可能感兴趣的:(Android开发)