【Android】RecyclerView的缓存机制

本文详细介绍了Android RecyclerView的缓存机制,包括Scrap和Recycle两种主要缓存类型。Scrap缓存包含mAttachedScrap和mChangedScrap,分别存储未修改和已修改的ViewHolder。Recycle缓存则通过mCachedViews和mRecyclerPool进行视图复用,其中mRecyclerPool按itemType分类存储。此外,还提及了mViewCacheExtension作为开发者自定义缓存和ChildHelper中的mHiddenViews缓存。文章探讨了各缓存层级的工作原理及作用,并以LinearLayoutManager为例,展示了如何在布局管理器中使用缓存。
摘要由CSDN通过智能技术生成

1.缓存层级

Scrap (view):在布局期间进入临时分离状态的子视图。废弃视图可以重复使用,而不会与父级RecyclerView完全分离,如果不需要重新绑定,则不进行修改,如果视图被视为脏,则由适配器修改。(这里的脏怎么理解呢?就是指那些在展示之前必须重新绑定的视图,比如一个视图原来展示的是“张三”,之后需要展示“李四”了,那么这个视图就是脏视图,需要重新绑定数据后再展示的。)
Recycle (view):先前用于显示适配器特定位置的数据的视图可以放置在高速缓存中以供稍后重用再次显示相同类型的数据。这可以通过跳过初始布局或构造来显着提高性能。
RecyclerView的缓存类型呢基本也就是上面的两种,这时可能有同学要站出来说我不对了,胡说,RecyclerView明明有四级缓存,怎么就两种了,骚年稍安勿躁,且听我来慢慢分解。首先我们先看一个RV(RecyclerView在后文简称RV)的内部类Recycler。

public final class Recycler {
   
	final ArrayList<ViewHolder> mAttachedScrap = new ArrayList<>();
	ArrayList<ViewHolder> mChangedScrap = null;

	final ArrayList<ViewHolder> mCachedViews = new ArrayList<ViewHolder>();
	RecycledViewPool mRecyclerPool;
	private ViewCacheExtension mViewCacheExtension;
	…… 省略 ……
}

就是介个类掌握着RV的缓存大权,从上面的代码片段我们可以看到这个类声明了五个成员变量。我们一个个的来说一下:

mAttachedScrap:我们可以看到这个变量是个存放ViewHolder对象的ArrayList,这一级缓存是没有容量限制的,只要符合条件的我来者不拒,全收了。前面讲两个专业术语的时候提到了Scrap,这个就属于Scrap中的一种,这里的数据是不做修改的,不会重新走Adapter的绑定方法。
mChangedScrap:这个变量和上边的mAttachedScrap是一样的,唯一不同的从名字也可以看出来,它存放的是发生了变化的ViewHolder,如果使用到了这里的缓存的ViewHolder是要重新走Adapter的绑定方法的。
mCachedViews:这个变量同样是一个存放ViewHolder对象的ArrayList,但是这个不同于上面的两个里面存放的是dettach掉的视图,它里面存放的是已经remove掉的视图,已经和RV分离的关系的视图,但是它里面的ViewHolder依然保存着之前的信息,比如position、和绑定的数据等等。这一级缓存是有容量限制的,默认是2(不同版本API可能会有差异,本文基于API26.1.0)。
mRecyclerPool:这个变量呢本身是一个类,跟上面三个都不一样。这里面保存的ViewHolder不仅仅是removed掉的视图,而且是恢复了出厂设置的视图,任何绑定过的痕迹都没有了,想用这里缓存的ViewHolder那是铁定要重新走Adapter的绑定方法了。而且我们知道RV支持多布局,所以这里的缓存是按照itemType来分开存储的,我们来大致的看一下它的结构:

public static class RecycledViewPool {
   
	private static final int DEFAULT_MAX_SCRAP = 5;
	static class ScrapData {
   
		ArrayList<ViewHolder> mScrapHeap = new ArrayList<>
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值