Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
MoJieBlog opened this issue Dec 3, 2019 · 4 comments

Comments

@MoJieBlog
Copy link
Collaborator

No description provided.

@zhaoerlei1989
Copy link

为啥都没有人回答我醉了
刷新全部可见的item,notifyDataSetChanged()
刷新指定item,notifyItemChanged(int)
从指定位置开始刷新指定个item,notifyItemRangeChanged(int,int)
插入、移动一个并自动刷新,notifyItemInserted(int)、notifyItemMoved(int)、notifyItemRemoved(int)
局部刷新,notifyItemChanged(int, Object)

@772865705
Copy link

为啥都没有人回答我醉了
刷新全部可见的item,notifyDataSetChanged()
刷新指定item,notifyItemChanged(int)
从指定位置开始刷新指定个item,notifyItemRangeChanged(int,int)
插入、移动一个并自动刷新,notifyItemInserted(int)、notifyItemMoved(int)、notifyItemRemoved(int)
局部刷新,notifyItemChanged(int, Object)

你很棒棒哟~

@aositeluoke
Copy link

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此参数不知道有何用

@mlinqirong
Copy link

notifyDataSetChanged 刷新全部可见
notifyItemChanged 刷新指定item
notifyItemRangeChanged 从指定开始 刷新指定item
notifyItemInserted 插入一个item并自动刷新
notifyItemRemoved 移动一个item并自动刷新
notifyItemRangeInserted 插入一个item并从指定位置开始刷新指定item
notifyItemRangeRemoved 删除一个item并从指定位置开始刷新指定item

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

6 participants