Moosphan/Android-Daily-Interview

2019-12-03:谈一谈RecyclerView.Adapter的几种刷新方式有何不同?

MoJieBlog opened this issue · 4 comments

2019-12-03:谈一谈RecyclerView.Adapter的几种刷新方式有何不同?

为啥都没有人回答我醉了
刷新全部可见的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