RecyclerView 数据更新方法 notifyItemChanged/notifyItemInsert/notifyIteRemoved

RecyclerView 数据更新方法 notifyItemChanged/notifyItemInsert/notifyIteRemoved

notifyItemInserted

java.lang.IndexOutOfBoundsException: 
Inconsistency detected. Invalid view holder adapter positionViewHolder{424b7690 position=7 id=-1, oldPos=8,pLpos:8 scrap tmpDetached no parent} at 
android.support.v7.widget.RecyclerView$Recycler.validat
eViewHolderForOffsetPosition(RecyclerView.java:4349)

工作中遇到如下问题 notifyItemInserted(list.size()-1),一个一个的插入也没什么问题,但是快速连续插入的话就会报出IndexOutOfBoundExcetion的异常,然后崩溃。经过多方查找,翻阅Android 的相关文档,发现如下解决方法。

使用notifyItemInserted方法向末尾处添加item的时候,要使用如下的方式

notifyItemInserted(list.size());

其中list.size()才能正确的计算出插入的位置,然后在调用

notifyItemChanged(list.size());

notifyItemRemoved

使用 notifyItemRemoved方法删除时,需要使用getLayoutPosition计算位置
否则也会报出IndexOutOfBoundExcetion异常,同时使用notifyItemChanged(removePos);方法刷新一下

notifyItemChanged

事实上RecyclerView的notifyItemChanged的底层调用的是notifyItemRangeChanged:

 /**
         * Notify any registered observers that the item at <code>position</code> has changed.
         * Equivalent to calling <code>notifyItemChanged(position, null);</code>.
         *
         * <p>This is an item change event, not a structural change event. It indicates that any
         * reflection of the data at <code>position</code> is out of date and should be updated.
         * The item at <code>position</code> retains the same identity.</p>
         *
         * @param position Position of the item that has changed
         *
         * @see #notifyItemRangeChanged(int, int)
         */
        public final void notifyItemChanged(int position) {
            mObservable.notifyItemRangeChanged(position, 1);
        }

该方法使得RecyclerView批量范围内(range)数据更新,notifyItemChanged巧妙的将第二个参数计数器设置为1得以实现。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,下面是 RecyclerView 数据更新的流程: 1. 更新数据源:首先,我们需要更新 RecyclerView数据源,也就是 adapter 中的数据。这可能通过某些事件触发,如用户输入、网络请求等等。在更新数据源之前,我们需要确保数据源已经准备好了,如数据已经从服务器获取,或用户已经完成了输入。 2. 通知 Adapter:当数据源已经更新后,我们需要通知 RecyclerView 的 adapter。这可以通过调用 adapter 的 `notifyDataSetChanged()` 方法来实现。这会告诉 adapter 数据已经改变,需要重新刷新 RecyclerView。 3. DiffUtil:如果数据源的改变比较复杂,或者你只想更新 RecyclerView 的部分数据,那么可以使用 DiffUtil。DiffUtil 是一个 Android Support Library 中的实用工具,它可以帮助你比较两个数据集之间的差异,并提供了一些方法更新 RecyclerView。通过使用 DiffUtil,你可以避免不必要的刷新,提高 RecyclerView 的性能。 4. 更新视图:当 adapter 接收到数据改变的通知后,它会重新绑定数据并通知 RecyclerView更新视图。这个过程会调用 adapter 的 `onBindViewHolder()` 方法,它会将数据绑定到 RecyclerView 的子项视图中。 5. 动画效果:如果你想在数据更新时添加一些动画效果,可以使用 RecyclerView 自带的动画效果,如 `DefaultItemAnimator`。你也可以自定义动画效果来满足你的需求。 以上就是 RecyclerView 数据更新的流程。需要注意的是,RecyclerView数据更新要遵循一些规则,如不要直接操作 adapter 的数据源,而是通过 adapter 的方法来操作数据源。这样可以保证 RecyclerView数据更新正确性和性能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五一编程

程序之路有我与你同行

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值