【Android -- 学习笔记】ListView 和 RecyclerView 的区别

在这里插入图片描述

1. 优化

ListView 优化需要自定义 ViewHolder 和判断 convertView 是否为 null 。 而 RecyclerView 是存在规定好的 ViewHolder 。

2. 布局不同

对于 ListView,只能在垂直的方向滚动。而对于 RecyclerView,他里面的 LayoutManager 中制定了一套可以扩展的布局排列接口,所以我们可以重写 LayoutManager 来定制自己需要的布局。RecycleView 可以根据 LayoutManger 有线性布局,瀑布流布局和网格布局。

  • LinearLayoutManager,可以支持水平和竖直方向上滚动的列表。
  • StaggeredGridLayoutManager,可以支持交叉网格风格的列表,类似于瀑布流或者Pinterest。
  • GridLayoutManager,支持网格展示,可以水平或者竖直滚动,如展示图片的画廊。

3. 更新数据

recycleView 可以支持在添加,删除或者移动 Item 的时候,RecyclerView.ItemAnimator 添加动画效果,而listview不支持。而且RecyclerView 有四重缓存,而 ListView 只有二重缓存。ListView和RecyclerView最大的区别在于数据源改变时的缓存的处理逻辑,ListView是"一锅端",将所有的mActiveViews都移入了二级缓存mScrapViews,而RecyclerView则是更加灵活地对每个View修改标志位,区分是否重新bindView。

3.1 Listview 的二级缓存

RecycleBin:大意就是通过两级缓存来缓存view。

(RecycleBin在layout的过程中便于view重用,RecycleBin有两级存储:ActiveViews和ScrapViews。

ActiveViews存储的是layout开始的时候屏幕上那些view。layout结束后,所有ActiveViews中的view被移动到ScrapViews中。

ScrapViews中的views是那些可能被adapter重新用到的view,以避免重新创建不必要的view。)

ActiveViews
一级缓存,顾名思义活动等view,这些view是布局过程开始屏幕上的view。layout开始时这个数组被填充,layout结束,ActiveViews中的view移动到 ScrapViews。ActiveViews代表了一个连续范围的views,其第一个view的位置存储在FirstActivePosition变量中。

ScrapViews
二级缓存,顾名思义废弃的view,无序的被adapter的convertView使用的view的集合
ScrapViews是多个list组成的数组,数组的长度为viewTypeCount,每个item是个list,所以每个list缓存不同类型item布局的 view

3.2 Recyclerview 的四级缓存

RecycleView 的四级缓存是由三个类共同作用完成的,Recycler、RecycledViewPool和ViewCacheExtension。

Recycler
​ 用于管理已经废弃或者与RecyclerView分离的ViewHolder,这里面有两个重要的成员

1.屏幕内缓存 一级缓存,屏幕内缓存指在屏幕中显示的ViewHolder,这些ViewHolder会缓存在AttachedScrap、ChangedScrap中

ChangedScrap —>表示数据已经改变的viewHolder列表

AttachedScrap—>表示未与RecyclerView分离的ViewHolder列表
2.屏幕外缓存 二级缓存,当列表滑动出了屏幕时,ViewHolder会被缓存在 CachedViews ,其大小由ViewCacheMax决定,默认DEFAULT_CACHE_SIZE为2,可通过Recyclerview.setItemViewCacheSize()动态设置。

RecycledViewPool
​ 三级缓存, RecycledViewPool类是用来缓存ViewHolder用,如果多个RecyclerView之间用setRecycledViewPool(RecycledViewPool)设置同一个RecycledViewPool,他们就可以共享ViewHolder。

ViewCacheExtension
​ 四级缓存, 开发者可自定义的一层缓存,是虚拟类ViewCacheExtension的一个实例,开发者可实现方法getViewForPositionAndType(Recycler recycler, int position, int type)来实现自己的缓存。

4. 自定义适配器

ListView 的适配器继承 ArrayAdapter ;RecycleView 的适配器继承 RecyclerAdapter ,并将范类指定为子项对象类.ViewHolder (内部类)。

5. 绑定事件不同

ListView 是在主方法中 ListView 对象的 setOnItemClickListener 方法;RecyclerView 则是在子项具体的 View 中去注册事件。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kevin-Dev

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值