RecyclerView 刷新踩坑记
Posted wellcherish
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RecyclerView 刷新踩坑记相关的知识,希望对你有一定的参考价值。
工作中现在都是使用 RecyclerView,RecyclerView 中,经常使用到的几个刷新函数如下:
第 1 组
- notifyDataSetChanged():无参,用于通知 Adapter 数据源发生变化并刷新。更新方式是所有 item 整体刷新,是最重的刷新方式
- notifyItemChanged(int position):单参,用于通知在数据源中,位置处于 position 的 item 更新。更新方式是单个 item 整体刷新
- notifyItemInserted(int position):单参,用于通知在数据源中,位置处于 position 的 item 之前有 item 插入,插入之后,position 位置的 item 位置变成了 position + 1。不过应该注意的是
- 该方法使用时,应该首先变化数据源,再调用该方法
- 该方法使用后,并不能真正插入一个 item,还应结合 notifyItemChanged 使用,才能真正插入一条数据。这个方法只是决定了像动画这些配置。
- notifyItemRemoved(int position):单参,作用和注意事项与 notifyItemInserted 类似,不过一个是增,一个是减。
- notifyItemMoved(int fromPosition, int toPosition):双参,作用和 notifyItemRemoved、notifyItemInserted 类似,不过此方法对应的含义是移动
第 2 组
- notifyItemRangeRemoved(int positionStart, int itemCount):通知范围内的 item 被整体删除了,需要和 notifyItemRangeChanged(int positionStart, int itemCount) 配合使用。
- notifyItemRangeInserted(int positionStart, int itemCount):通知范围内的 item 整体增加,需要和 notifyItemRangeChanged(int positionStart, int itemCount) 配合使用。
- notifyItemRangeChanged(int positionStart, int itemCount):通知范围内的 item 变化了
第 3 组
形如 notifyItemChanged(int position, @Nullable Object payload) 等带上 payload 的方法,其含义都是局部刷新。与三参 onBindViewHolder 结合使用。
遇到的坑
- android 中没有提供指定某些 position (位置并不连续) 的 item 更新的方法,我们能做的就是在绑定时进行过滤。
- 部分情况下,可能局部通知刷新并不生效,比如 activity 不在前台,并且不在栈顶时。这时候就需要调用整体刷新的方法,如 notifyDataSetChanged 和 notifyItemChanged。
- 整体刷新方法部分情况下也有可能并不生效。可能的原因有通知刷新的线程不在 UI 线程(网上的回答,真实性待验证),或者比如 activity 处在后台,处于前台的界面通知其刷新。调用了 notifyItemChanged 方法,此时并不能走到 onBindViewHolder 中,导致界面无法刷新。
- notifyDataSetChanged 方法部分情况下可能也不会生效。比如 activity 处于较深的栈底,处于栈顶的界面通知其刷新,此时调用了 notifyDataSetChanged 方法,但是 adapter 并没有走到 onBindViewHolder 方法中。此时就需要将更新的数据记录下来,放入内存或者本地存储中。在界面从栈顶退回栈底 activity 时,便可以读取数据,重走绑定流程,保证数据准确。强烈建议将数据存入本地存储中,这是最稳妥的方式。
以上是关于RecyclerView 刷新踩坑记的主要内容,如果未能解决你的问题,请参考以下文章