Android Tip : RecyclerView常见问题 - 属性处理顺序

RecyclerView是常用的控件之一,最大的特点就是复用,而复用的item是携带了上次的数据和属性的。如果没有考虑到这一点,就会在第一时间很茫然。而且,如果异常不是UI层面可感知的,那就需要更长的时间来思考了。

例子:


Android Tip : RecyclerView常见问题 - 属性处理顺序_第1张图片
截图

有问题的代码:

        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属性被修改。

Android Tip : RecyclerView常见问题 - 属性处理顺序_第2张图片
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的数据(并不是最佳性能)

你可能感兴趣的:(Android Tip : RecyclerView常见问题 - 属性处理顺序)