频道栏目
首页 > 资讯 > Android > 正文

Android开发基础之ListView和RecyclerView缓存机制

17-10-06        来源:[db:作者]  
收藏   我要投稿

ListView的RecycleBin

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

RecycleBin机制

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

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

如果滑动中View一直OnScreen,那么我们称其为ActiveView。

RecycleBin中有两个数组:mActiveViews和mScrapViews,分别用来存放直接复用和间接复用的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其他的区别

RecyclerView 能够支持各种各样的布局效果。 RecyclerView 可以局部刷新 RecyclerView 可以设置item动画效果 RecyclerView没有设置 setOnItemClickListener只有addOnItemTouchListener

 

相关TAG标签
上一篇:创建动画方法教程
下一篇:Json数据解析“编程开发”
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站