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

来源:互联网 发布:手机做淘宝客怎么做 编辑:程序博客网 时间:2024/04/29 14:57

问题

如图显示

产生从详情返回至列表页时,下方的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);    }``` 
阅读全文
0 0
原创粉丝点击