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[] 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 mAttachedScrap = new ArrayList<>();
final ArrayList mCachedViews = new ArrayList();
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

你可能感兴趣的:(ListView、Recyclerview)