RecyclerView回收复用引起的checkbox状态改变回

2020-11-17  本文已影响0人  尼古拉斯小韭菜

先看一段代码

mCheckBox.setChecked(itemData.isSelected);
mCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                   itemData.isSelected = isChecked;
            }
});

我们在RecylerView或者ListView中绑定添加CheckBox并记录状态时我们经常写这样的代码,但是这样写会出现一个很莫名其妙的问题-状态保存不了,debug调试后发现当CheckBox复用时会导致onCheckedChanged回调,进而改变了已经保存的状态。

分析其根本原因我们发现,是RecylerView复用机制导致的问题,因为当View复用时,原来被回收的View会先调用mCheckBox.setChecked设置状态,从而导致之前创建的View回调了之前设置的listener,正确的顺序应该是颠倒过来。

mCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                   itemData.isSelected = isChecked;
            }
});

mCheckBox.setChecked(itemData.isSelected);
先设置Listener再设置状态。

上一篇 下一篇

猜你喜欢

热点阅读