ListView
ListView:ActiveViews and ScrapViews
ListView的父類AbsListView有個RecycleBin內(nèi)部類,RecycleBin維護(hù)了兩個數(shù)組mActiveViews、mScrapViews,mActiveViews中存放的是顯示到屏幕上的item,mScrapViews存放的是移除到屏幕外的item
//可見的View數(shù)組
private View[] mActiveViews = new View[0];
//不可見的的View數(shù)組,是一個集合數(shù)組,每一種type的item都有一個集合來緩存
private ArrayList<View>[] mScrapViews;
經(jīng)過測試發(fā)現(xiàn)ListView在顯示數(shù)據(jù)的時候會調(diào)用兩次onLayout方法

image.png
對于數(shù)據(jù)源改變時的情況?
Recyclerview
參考文章:
關(guān)于Recyclerview預(yù)布局
RecyclerView 為什么要經(jīng)過兩次布局(有一次預(yù)布局),因為動畫影響的,
因為Recyclerview不知道item要做什么類型的動畫。
https://juejin.im/post/5b79a0b851882542b13d204b
http://www.itdecent.cn/p/311df8be8633
https://phantomvk.github.io/2019/02/13/RecyclerView_cache/
緩存:http://www.itdecent.cn/p/efe81969f69d
需要關(guān)注的幾個類:
final ArrayList<ViewHolder> mAttachedScrap = new ArrayList<>();
final ArrayList<ViewHolder> mCachedViews = new ArrayList<ViewHolder>();
RecycledViewPool mRecyclerPool;
mCachedViews集合大小默認(rèn)只能存儲兩條數(shù)據(jù),看是可以自定義大小
recyclerView.setItemViewCacheSize(5);
RecycledViewPool也是Recyclerview的一個內(nèi)部類
mRecyclerPool ViewHolder緩存池,在有限的mCachedViews中如果存不下ViewHolder時,就會把ViewHolder存入RecyclerViewPool中。
- 按照Type來查找ViewHolder
-
每個Type默認(rèn)最多緩存5個
可以自定義每種type最多緩存的個數(shù)
image.png

image.png

image.png

image.png

image.png

image.png
