ListView、Recyclerview

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
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容