05
2017
10

【Android】の基础——ListView和RecyclerView缓存机制

ListView的RecycleBin

我们在自定义ListView,重写Adapter的getView方法时,会注意到一个convertView参数。那么它从何而来?这要源于ListView的RecycleBin机制。

RecycleBin机制

ListView中可见的View其状态为OnScreen,不可见的View状态为OffScreen

在ListView滑动的过程中,View如果由OnScreen变成OffScreen那么我们称它为ScrapView
如果滑动中View一直OnScreen,那么我们称其为ActiveView

RecycleBin中有两个数组:mActiveViewsmScrapViews,分别用来存放直接复用和间接复用的View。

ListView在绘制children的时候,首先根据数据源是否变化将children加入到mScrapViews或者mActiveViews中。
然后ListView清空children。
最后ListView在添加View的时候,进行判断,如果数据源没发生变化,那么尝试用该position从RecycleBin的mActiveViews中获取可复用的View。
如果没能够从mActivieViews中直接复用View,那么就要调用obtainView方法获取View,该方法尝试间接复用RecycleBin中的mScrapViews中的View,如果不能间接复用,则创建新的View。

例子

假设在某一时刻ListView中显示了10个子View,position依次为从0到9。然后我们手指向上滑动,且向上滑动了一个子View的高度,ListView需要绘制下一帧。这时候ListView在layoutChildren方法中把这10个子View都放入到了RecycleBin的mActiveViews数组中了,然后清空了children数组,然后调用fillDown方法,向ListView中依次添加position1到10的子View,在添加position为1的子View的时候,由于在上一帧中position为1的子View已经被放到mActiveViews数组中了,这次直接可以将其从mActiveViews数组中取出来,这样就是直接复用子View,所以说RecycleBin的mActiveViews数组主要是用于直接复用的。

RecyclerView缓存

Recycler

Recycler是RecyclerView的内部类,用于管理已经废弃或者与RecyclerView分离的ViewHolder。它有这几个成员变量:
1. mChangedScrap:表示数据已经改变的ViewHolder列表。
2. mAttachedScrap :未与RecyclerView分离的ViewHolder列表。
3. mCachedViews: ViewHolder缓存列表。其大小由mViewCacheMax决定,默认DEFAULT_CACHE_SIZE为2,可动态设置。
4. mViewCacheExtension:开发者可自定义的缓存。是虚拟类ViewCacheExtension的一个实例,开发者可实现方法getViewForPositionAndType(Recycler recycler, int position, int type)来实现自己的缓存。
5. mRecyclerPool:ViewHolder缓存池。在有限的mCachedViews中如果存不下ViewHolder时,就会把ViewHolder存入RecyclerViewPool中。

两者对比

ListView缓存

这里写图片描述

RecyclerView缓存

这里写图片描述

ListView和RecyclerView其他的区别

  1. RecyclerView 能够支持各种各样的布局效果。
  2. RecyclerView 可以局部刷新
  3. RecyclerView 可以设置item动画效果
  4. RecyclerView没有设置 setOnItemClickListener只有addOnItemTouchListener
上一篇:Python GUI编程(Tkinter)创建一个GUI程序 下一篇:(一)安卓框架搭建之项目分层、主题、gradle基本配置