ListView、Recyclerview

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方法
image.png
对于数据源改变时的情况?

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最多缓存的个数


    image.png
image.png
image.png

image.png

image.png
image.png
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容