ListView
ListView:ActiveViews and ScrapViews
ListView的父类AbsListView有个RecycleBin内部类,RecycleBin维护了两个数组mActiveViews、mScrapViews,mActiveViews中存放的是显示到屏幕上的item,mScrapViews存放的是移除到屏幕外的item
//可见的View数组
private View[] mActiveViews = new View[0];
//不可见的的View数组,是一个集合数组,每一种type的item都有一个集合来缓存
private ArrayList<View>[] mScrapViews;
经过测试发现ListView在显示数据的时候会调用两次onLayout方法
对于数据源改变时的情况?
Recyclerview
参考文章:
关于Recyclerview预布局
RecyclerView 为什么要经过两次布局(有一次预布局),因为动画影响的,
因为Recyclerview不知道item要做什么类型的动画。
https://juejin.im/post/5b79a0b851882542b13d204b
https://www.jianshu.com/p/311df8be8633
https://phantomvk.github.io/2019/02/13/RecyclerView_cache/
缓存:https://www.jianshu.com/p/efe81969f69d
需要关注的几个类:
final ArrayList<ViewHolder> mAttachedScrap = new ArrayList<>();
final ArrayList<ViewHolder> mCachedViews = new ArrayList<ViewHolder>();
RecycledViewPool mRecyclerPool;
mCachedViews集合大小默认只能存储两条数据,看是可以自定义大小
recyclerView.setItemViewCacheSize(5);
RecycledViewPool也是Recyclerview的一个内部类
mRecyclerPool ViewHolder缓存池,在有限的mCachedViews中如果存不下ViewHolder时,就会把ViewHolder存入RecyclerViewPool中。
- 按照Type来查找ViewHolder
-
每个Type默认最多缓存5个
可以自定义每种type最多缓存的个数