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屬性被修改。
log
修改方式:
先設置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的數據(并不是最佳性能)