可供参考的RecyclerView中可能出现的CheckBox,EditText等滑动之后顺序错乱解决方案

最近在项目中遇到了一个诡异的问题,在做一个填写报表界面,这个报表界面有N个item,每个item里面有N个EditText。如果我滑动到一定距离(item被回收复用)之后,再次滑过去的时候,item里面CheckBox的选中状态错乱,EditText的文本错乱。因为每个item里面全是EditText,没有其他的对比项,所以就以为是复用的问题,然后一直在找复用的问题,于是乎我设置了不可复用setIsRecyclable(false);即:

        public ViewHolder(View itemView) {
            super(itemView);
            ButterKnife.bind(this, itemView);
            setIsRecyclable(false);
        }

但是,新的风暴又来了,这不仅会导致滑动不丝滑,错乱问题还是会存在,并且,添加和删除item的效果也没有了。于是乎,我果断删除了setIsRecyclable属性,另辟蹊径。

突然之间,脑中闪过一道闪电,想起了一个instance的问题,于是就Boom了。在绑定ViewHolder的时候:

        TextWatcher watcher = new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
            }

            @Override
            public void afterTextChanged(Editable s) {
                list.get(position).setDes(s.toString());
            }
        };
        viewHolder.etTarget.addTextChangedListener(watcher);

这是我的textWatcher,每次编辑后将新的值存到list里面去,这样在提交表单的时候,就可以直接提交。假如,我在这段代码前添加

if (viewHolder.etTarget.getTag() instanceof TextWatcher){
    viewHolder.etTarget.removeTextChangedListener(
        (TextWatcher) viewHolder.etTarget.getTag());
   }
       viewHolder.etTarget.setText(""+list.get(position).getDes();

呵呵,问题解决。关键就在于,recyclerView他不会记住你的tag。如果加了tag,顺序不会错乱,滑动效果丝滑如初,添加和删除的效果也在。道理就有点像之前优化listView的时候,要给contentView加个tag,如果他有tag,则取他之前的tag的,如果没有再new一个。

CheckBox的选中状态跟这个原理差不多的,我就不贴出来了,老铁们自行撸码,加深印象,共勉。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值