notifyItemChanged(int position) 引起的返回时RecyclerView页面不自然的跳动

本文针对RecyclerView在使用notifyItemChanged时产生的向上动画问题进行探讨,并提供了解决方案。通过使用payloads参数并重写onBindViewHolder方法,实现了仅更新指定数据而不触发图片重绘的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题

如图显示

产生从详情返回至列表页时,下方的Item有个向上的动画。我在返回的同时有发一个eventBus,其中我调用了notifyItemChanged(int position)方法,我首先想到的是添加mRecyclerView.getItemAnimator().setChangeDuration(0);此方法(因为以前发生过页面闪的动画),但是很不幸的是加了此代码之后还是会有此问题。

然后我再利用排除法把notifyItemChanged(int position)这行代码注释一下,看看是不是由此影响的刷新情况。注释之后果然返回的时候已经不会刷了,但是我必须按照要求详情改变了数据之后需要刷新列表的数据,所以这行代码是不可以删除的。于是我经过大量的返回测试之后我发现了,这个向上的动画只有在列表当中有图片才回出现,所以这时候想到的原因应该就是因为重新绘制了一遍图片的宽高,所以才会有下面的item发生位置的变化,这个时候我想到的解决办法是能不能回调刷新的时候不刷新图片,只刷新我需要的数据。所以debug了一下,发现了notifyItemChanged(int position)走的是notifyItemRangeChanged(int positionStart, int itemCount, Object payload)同时在Adapter当中都是走onBindViewHolder(VH holder, int position, List<Object> payloads),这其中都有payload这个东东,所以我先google了一下,在这篇文章当中找到了解释,原来只需要在你自己的adapter重写一下onBindViewHolder(VH holder, int position, List<Object> payloads)这个方法,当然要不影响你原来的recyclerView的adapter应该做好判断,例如:

```
 @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        holder.updatePosition(position);
        convert(holder, getItem(position));
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position, List<Object> payloads) {
        if (payloads.isEmpty()) {
            onBindViewHolder(holder, position);
        } else {
            holder.updatePosition(position);
            convert(holder, getItem(position), payloads);
        }
    }
```

根据payloads是否又传值来判断是走那个方法。

还有一个很关键的是需要注意如果你是用了一个adapterWarpper重新包装了一下adpater(例如给adapter增加头部,增加底部),同样要记得在adapterWapper当中重写走onBindViewHolder(VH holder, int position, List<Object> payloads)此方法。

```
 @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        wrapped.onBindViewHolder(holder, position);
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position, List payloads) {
        wrapped.onBindViewHolder(holder, position, payloads);
    }
``` 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值