RecyclerView是常用的控件之一,最大的特点就是复用,而复用的item是携带了上次的数据和属性的。如果没有考虑到这一点,就会在第一时间很茫然。而且,如果异常不是UI层面可感知的,那就需要更长的时间来思考了。
例子:
有问题的代码:
private void setDefaultAction (final InvoiceBean bean, RadioButton radioButton) {
radioButton.setChecked(bean.getIs_default() == 1);
radioButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged (CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
if (bean.getIs_default() == 1) {
//do nothing
} else {
bean.setIs_default(1);
RequestStrategy.getInstance().requestModifyInvoice(bean);
}
}
}
});
}
item中有单选按钮,向上滑动,当check==false的RadioButton被check==true的item复用时,会把 会回调上个数据项目的check操作,导致唯一的check属性被修改。
修改方式:
先设置listener,后设置属性,
修复后的代码:
private void setDefaultAction (final InvoiceBean bean, RadioButton radioButton) {
radioButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged (CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
if (bean.getIs_default() == 1) {
//do nothing
} else {
bean.setIs_default(1);
RequestStrategy.getInstance().requestModifyInvoice(bean);
}
}
}
});
radioButton.setChecked(bean.getIs_default() == 1);
}
这个修改非常简单,但比较重要的是,要有一种意识:
RecyclerView原则
- 考虑到ViewHolder已经携带的数据对当前item的影响。
- 根据业务需要判断要不要remove全部ViewHolder的数据(并不是最佳性能)