RecyclerView与ListView区别及缓存原理

在这里插入图片描述

1.RecyclerView 家族类图

在这里插入图片描述

2.RecyclerView 和 ListView的区别

1.从使用上

ListView:继承重写 BaseAdapter,自定义 ViewHolder 与 converView优化。

RecyclerView: 继承重写 RecyclerView.Adapter 与 RecyclerView.ViewHolder。设置 LayoutManager 来展示不同的布局样式

区别:

  • ViewHolder的编写规范化,ListView是需要自己定义的,而RecyclerView是规范好的;
  • RecyclerView复用item全部搞定,不需要像ListView那样setTag()与getTag();
  • RecyclerView多了一些LayoutManager工作,但实现了布局效果多样化;

ListView只支持单一的纵向布局,RecyclerView支持线性布局,表格布局和瀑布流布局

ListView 支持设置 HeaderView 和 FooterView,而 RecyclerView 添加头部和底部需要自己在 Adapter中根据 ViewHolder 的 Type 编写。

2.数据刷新

ListView 刷新调用 notifyDataSetChanged() ,全局刷新数据 (每个 Item 数据会重新加载)

  • 要在ListView实现局部刷新,依然是可以实现的,当一个item数据刷新时,可以在Adapter中,实现一个onItemChanged()方法,在方法里面获取到这个item的position(可以通过getFirstVisiblePosition()),然后调用getView()方法来刷新这个item的数据;

RecyclerView 支持局部刷新。

3.动画区别

RecyclerView中,内置有许多动画API,例如:notifyItemChanged(), notifyDataInserted(), notifyItemMoved()等等;如果需要自定义动画效果,可以通过实现(RecyclerView.ItemAnimator类)完成自定义动画效果,然后调用RecyclerView.setItemAnimator();

但是ListView并没有实现动画效果,但我们可以在Adapter自己实现item的动画效果;

4.缓存区别

ListView和RecyclerView最大的区别在于数据源改变时的缓存的处理逻辑,ListView是”一锅端”,将所有的mActiveViews都移入了二级缓存mScrapViews,而RecyclerView则是更加灵活地对每个View修改标志位,区分是否重新bindView。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aqyXPwSq-1634197987336)(../../pic/v2-0ea7851996a39115901c2ae3cd5767dd_r.jpg)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-328cbQ9F-1634197987337)(../../pic/v2-746b3372c1f813d990681280fe5e93b3_720w.jpg)]

3.RecyclerView缓存

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bktiZO0C-1634197987339)(../../pic/1628088645609.png)]

缓存原理说明

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JVWX6znk-1634197987340)(../../pic/1628089492566.png)]

调用 notifyItemChanged( item_02) 时候,RecyclerView 认为 1, 3 , 4 , 5 未发生变化,此时会存入到 mAttachScrop 缓存集合中。而 item_02 是被修改了,存入到 mChangedScrap 集合中。

**总结:**mAttachScrop 保存的是原封不动的 ViewHolder。而 mChangedScrap 保存的是变化的 ViewHolder。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VVKJEb1r-1634197987340)(../../pic/1628089796402.png)]

当将 Item_01 滑动出屏幕的时候,RecyclerView 认为该 ViewHolder 很可能会被再次滑进屏幕。此时将它存入到 mCachedViews 集合中。当反向滑动屏幕的时候,之前的 Item_01 又被滑进屏幕时,此时 Item_01 与原来的位置一致。也是不需要重新绑定数据的

mCachedViews 中缓存的 ViewHolder 已满时,会将最先添加进的 ViewHolder 移到 mRecyclerPool 四级缓存集合中。

注意: mRecyclerPool 是不参与缓存阶段的,只参与复用阶段。

原理:

当每次调用: notifyItemChanged 或者 notifyDataChanged 都会调用:detachAndScrapAttachedViews() 方法。

该方法在向列表当中填充 Item 的时候,直接从 Recycler中去获取 ViewHolder。如果缓存池中获取不到 ViewHolder,则会去创建新的 ViewHolder,然后在重新绑定数据。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rcX1gGKi-1634197987341)(../../pic/1628090807578.png)]

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值