先看一段代码
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再设置状态。
网友评论