写点什么

Listview 与 RecyclerView 对比浅析【重点对比缓存】,深入浅出

作者:嘟嘟侠客
  • 2021 年 11 月 28 日
  • 本文字数:2260 字

    阅读完需:约 7 分钟

3.局部刷新




在 ListView 中通常刷新数据是用 notifyDataSetChanged() ,但是这种刷新数据是全局刷新的(每个 item 的数据都会重新加载一遍),这样一来就会非常消耗资源;


RecyclerView 中可以实现局部刷新,例如:notifyItemChanged();


如果要在 ListView 实现局部刷新,依然是可以实现的,当一个 item 数据刷新时,我们可以在 Adapter 中,实现一个 notifyItemChanged()方法,在方法里面通过这个 item 的 position,刷新这个 item 的数据


4.动画效果




在 RecyclerView 中,已经封装好 API 来实现自己的动画效果;并且如果我们需要实现自己的动画效果,我们可以通过相应的接口实现自定义的动画效果(RecyclerView.ItemAnimator 类),然后调用 RecyclerView.setItemAnimator() (默认的有 SimpleItemAnimator 与 DefaultItemAnimator);


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


5.缓存区别




层级不同


ListView 有两级缓存,在屏幕与非屏幕内。mActivityViews + mScrapViews


RecyclerView 比 ListView 多两级缓存:支持开发者自定义缓存处理逻辑,RecyclerViewPool(缓存池)。并且支持多个离屏 ItemView 缓存(缓存屏幕外 2 个 itemView)。 mAttachedScrap + mCacheViews + mViewCacheExtension + mRecyclerPool


缓存内容不同


ListView 缓存 View。


RecyclerView 缓存 RecyclerView.ViewHolder


RV 优势


a.mCacheViews 的使用,可以做到屏幕外的列表项 ItemView 进入屏幕内时也无须 bindView 快速重用;


b.mRecyclerPool 可以供多个 RecyclerView 共同使用,在特定场景下,如 viewpaper+多个列表页下有优势.


缓存区别


====


1,封装了 viewholder,Listview 需要自己写 ViewHolder 缓存,而 RecyclerView 已经帮我们实现了。


2,RecyclerView 的缓存机制有了加强,ListView 是 2 级缓存,而 RecyclerView 实现了 4 级缓存。


3,RecyclerView 相对于 ListView 最大的加强是实现了局部刷新,这对于 ListView 需要刷新全部列表进步很多,特别适用于那些数据源经常发生改变的情况。


下面从缓存机制做出对比:


ListView 和 RecyclerView 的缓存机制大致类似:



过程中,离


《Android 学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》

【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整内容开源分享


屏的 ItemView 即被回收至缓存,入屏的 ItemView 则会优先从缓存中获取,只是 ListView 与 RecyclerView 的实现细节有差异.(这只是缓存使用的其中一个场景,还有如刷新等)。


1,缓存机制不同


RecyclerView 比 ListView 多两级缓存,支持多个离 ItemView 缓存,支持开发者自定义缓存处理逻辑,支持所有 RecyclerView 共用同一个 RecyclerViewPool(缓存池)。


具体来说:


ListView(两级缓存):



RecyclerView(四级缓存):



ListView 和 RecyclerView 缓存机制基本一致:


1). mActiveViews 和 mAttachedScrap 功能相似,意义在于快速重用屏幕上可见的列表项 ItemView,而不需要重新 createView 和 bindView;



2). mScrapView 和 mCachedViews + mReyclerViewPool 功能相似,意义在于缓存离开屏幕的 ItemView,目的是让即将进入屏幕的 ItemView 重用.



3). RecyclerView 的优势在于 a.mCacheViews 的使用,可以做到屏幕外的列表项 ItemView 进入屏幕内时也无须 bindView 快速重用;b.mRecyclerPool 可以供多个 RecyclerView 共同使用,在特定场景下,如 viewpaper+多个列表页下有优势.客观来说,RecyclerView 在特定场景下对 ListView 的缓存机制做了补强和完善。


2. 缓存不同:


1). RecyclerView 缓存 RecyclerView.ViewHolder,抽象可理解为:


View + ViewHolder(避免每次 createView 时调用 findViewById) + flag(标识状态);


RecyclerView 中 mCacheViews(屏幕外)获取缓存时,是通过匹配 pos 获取目标位置的缓存,这样做的好处是,当数据源数据不变的情况下,无须重新 bindView:


2). ListView 缓存 View。而同样是离屏缓存,ListView 从 mScrapViews 根据 pos 获取相应的缓存,但是并没有直接使用,而是重新 getView(即必定会重新 bindView)。


二、 局部刷新


RecyclerView 更大的亮点在于提供了局部刷新的接口,通过局部刷新,就能避免调用许多无用的 bindView。ListView 和 RecyclerView 最大的区别在于数据源改变时的缓存的处理逻辑,ListView 是"一锅端",将所有的 mActiveViews 都移入了二级缓存 mScrapViews,而 RecyclerView 则是更加灵活地对每个 View 修改标志位,区分是否重新 bindView。


ListView 获取缓存的流程:



RecyclerView 获取缓存的流程:



结合 RecyclerView 的缓存机制,看看局部刷新是如何实现的:


以 RecyclerView 中 notifyItemRemoved(1)为例,最终会调用 requestLayout(),使整个 RecyclerView 重新绘制,过程为:

面试复习笔记

这份资料我从春招开始,就会将各博客、论坛。网站上等优质的 Android 开发中高级面试题收集起来,然后全网寻找最优的解答方案。每一道面试题都是百分百的大厂面经真题+最优解答。包知识脉络 + 诸多细节。节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。


《960 页 Android 开发笔记》



《1307 页 Android 开发面试宝典》


包含了腾讯、百度、小米、阿里、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率。



《507 页 Android 开发相关源码解析》


只要是程序员,不管是 Java 还是 Android,如果不去阅读源码,只看 API 文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。


真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。



本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录

用户头像

嘟嘟侠客

关注

还未添加个人签名 2021.03.19 加入

还未添加个人简介

评论

发布
暂无评论
Listview与RecyclerView对比浅析【重点对比缓存】,深入浅出