2019-12-03:谈一谈RecyclerView.Adapter的几种刷新方式有何不同?
MoJieBlog opened this issue · 4 comments
为啥都没有人回答我醉了
刷新全部可见的item,notifyDataSetChanged()
刷新指定item,notifyItemChanged(int)
从指定位置开始刷新指定个item,notifyItemRangeChanged(int,int)
插入、移动一个并自动刷新,notifyItemInserted(int)、notifyItemMoved(int)、notifyItemRemoved(int)
局部刷新,notifyItemChanged(int, Object)
为啥都没有人回答我醉了
刷新全部可见的item,notifyDataSetChanged()
刷新指定item,notifyItemChanged(int)
从指定位置开始刷新指定个item,notifyItemRangeChanged(int,int)
插入、移动一个并自动刷新,notifyItemInserted(int)、notifyItemMoved(int)、notifyItemRemoved(int)
局部刷新,notifyItemChanged(int, Object)
你很棒棒哟~
1、notifyDataSetChanged()
-
可见item前面5个的onCreateViewHolder不会执行,也就是说从第6个开始使用缓存中的ViewHolder
-
可见item的onBindViewHolder都会执行
2、notifyItemChanged(int position)
前提:一屏幕只显示20条数据,调用notifyItemChanged(0)
-
position为21的onCreateViewHolder优先执行
-
接着position为0的onCreateViewHolder开始执行
3、notifyItemChanged(int position, @nullable Object payload)
4、notifyItemRangeChanged(int positionStart, int itemCount)
前提:一屏幕只显示20条数据,调用notifyItemRangeChanged(0,5)
-
position为21,22,23,24,25的onCreateViewHolder依序执行
-
接着position为0,1,2,3,4的onCreateViewHolder依序执行
-
从数据集合中拿数据时,可能会发生数据越界异常
5、notifyItemRangeChanged(int positionStart, int itemCount,
@nullable Object payload)
6、notifyItemInserted(int position)
前提:一屏幕只显示20条数据,调用notifyItemInserted(1)
- 在position为1的这个地方,多了一个ItemView,数据是mDatas.get(1)中的数据
总结:不管数据集合是否改变,调用此方法时,都在在指定的位置插入ItemView,从数据集合中的position这个地方拿数据填充
7、notifyItemMoved(int fromPosition, int toPosition)
前提:一屏幕只显示20条数据,调用notifyItemMoved(3,10)
- 把位置为3的视图移动到位置为10这个地方,4~10这些位置的item都往前移动一个位置
8、notifyItemRangeInserted(int positionStart, int itemCount)
前提:一屏幕只显示20条数据,调用notifyItemRangeInserted(3,10)
-
在位置为3处开始插入10个视图,数据也是从3开始
-
从数据集合中拿数据时,可能会发生数据越界异常
-
会发生数组越界异常
9、notifyItemRemoved(int position)
前提:数据集合有50条数据,调用notifyItemRemoved(51)
-
不会发生数组异常
-
如果数据集合中未移除第0条数据,就掉调用了notifyItemRemoved(0),此时会移除视图,但是上下滚动时,还是会出现
10、notifyItemRangeRemoved(int positionStart, int itemCount)
前提:数据集合有50条数据,调用notifyItemRangeRemoved(0,100)
- 不会发生数组异常
payload此参数不知道有何用
notifyDataSetChanged 刷新全部可见
notifyItemChanged 刷新指定item
notifyItemRangeChanged 从指定开始 刷新指定item
notifyItemInserted 插入一个item并自动刷新
notifyItemRemoved 移动一个item并自动刷新
notifyItemRangeInserted 插入一个item并从指定位置开始刷新指定item
notifyItemRangeRemoved 删除一个item并从指定位置开始刷新指定item