Listview 与 RecyclerView 对比浅析【重点对比缓存】,深入浅出
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 文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。
真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。

评论