美文网首页
RecyclerView回收复用引起的checkbox状态改变回

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

作者: 尼古拉斯小韭菜 | 来源:发表于2020-11-17 08:20 被阅读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再设置状态。

相关文章

网友评论

      本文标题:RecyclerView回收复用引起的checkbox状态改变回

      本文链接:https://www.haomeiwen.com/subject/amdzbktx.html