RecyclerView的复用机制,建议细读

即一开始中没有任何数据,添加数据源后。状态变化如下图:很明显在这种情形下Recycler中是不会存在任何可复用的ViewHolder。所以所有的ViewHolder都是新创建的。即会调用。那这些创建的ViewHolder会缓存起来吗?这时候新创建的这些ViewHolder是不会被缓存起来的。即在这种情形下:Recycler只会通过Adapter创建ViewHolder,并且不会缓存这些新创建的ViewHolder。
摘要由CSDN通过智能技术生成

即一开始RecyclerView中没有任何数据,添加数据源后adapter.notifyXXX。状态变化如下图:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

很明显在这种情形下Recycler中是不会存在任何可复用的ViewHolder。所以所有的ViewHolder都是新创建的。即会调用Adapter.createViewHolder()和Adapter.bindViewHolder()。那这些创建的ViewHolder会缓存起来吗?

这时候新创建的这些ViewHolder是不会被缓存起来的。 即在这种情形下: Recycler只会通过Adapter创建ViewHolder,并且不会缓存这些新创建的ViewHolder

情形二 : 在原有数据的情况下进行整体刷新

就是下面这种状态:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其实就是相当于用户在feed中做了下拉刷新。实现中的伪代码如下:

dataSource.clear()
dataSource.addAll(newList)
adapter.notifyDatasetChanged()

在这种情形下猜想Recycler肯定复用了老的卡片(卡片的类型不变),那么问题是 : 在用户刷新时旧ViewHolder保存在哪里? 如何调用旧ViewHolderAdapter.bindViewHolder()来重新设置数据的?

其实在上一篇文章Recycler刷新机制中,LinearLayoutManager在确定好布局锚点View之后就会把当前attachRecyclerView上的子View全部设置为scrap状态:

void onLayoutChildren(RecyclerView.Recycler recycler, R

  • 15
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RecyclerView复用错乱问题是因为它的使用方式不正确所导致的。复用错乱是指在滑动RecyclerView时,列表项的数据与视图不匹配,在屏幕上显示的数据混乱或重复。 造成这个问题的常见原因有以下几点: 1. 数据源更新不及时:当数据源发生变化时,需要及时更新适配器的数据集。如果没有正确地处理数据源的变化,就会导致RecyclerView中的视图与数据不匹配。 2. 没有正确实现ViewHolder模式:RecyclerView通过重用ViewHolder来提高性能。如果没有正确实现ViewHolder模式,就会导致视图复用时数据混乱。正确的做法是在ViewHolder中设置视图的数据,而不是在绑定ViewHolder时修改视图的数据。 3. 使用了错误的布局管理器:布局管理器决定了RecyclerView中列表项的排列方式。如果使用了错误或不合适的布局管理器,就会导致列表项的位置混乱或错乱。 解决RecyclerView复用错乱问题的方法有以下几点: 1. 在数据源发生变化时,及时更新适配器的数据集,并调用适配器的notifyDataSetChanged方法,通知RecyclerView进行视图更新。 2. 确保正确实现ViewHolder模式,在ViewHolder中正确地设置视图的数据。 3. 注意选择合适的布局管理器,确保列表项的位置正确排列。 4. 可以使用一些开源库或框架,如DiffUtil或DataBinding等,来简化数据源更新和视图更新的过程。 总结起来,解决RecyclerView复用错乱问题的关键是正确处理数据源的更新、正确实现ViewHolder模式、选择合适的布局管理器,并注意使用相关的开源库或框架来简化开发过程。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值