天天看點

ListView和RecyclerView緩存的差別ListViewRecyclerViewListView和RecyclerView緩存機制對比:

ListView

1.繼承重寫BaseAdapter類

2.自定義ViewHolder與ConvertView的優化

布局

單一布局,隻可以實作縱向效果

緩存機制

兩級緩存

mActiveViews:快速重用螢幕上可見的清單項,不需要重新createView和bindView;

mScrapViews:緩存離開螢幕的ItemView,目的是讓即将進入螢幕的ItemView重用.

ListView和RecyclerView緩存的差別ListViewRecyclerViewListView和RecyclerView緩存機制對比:

重新整理

通常情況下的重新整理都是全局重新整理(消耗資源) notifyDataSetChanged()

局部重新整理步驟:①實作onItemChanged()方法

       ②通過onItemChanged()方法擷取對應的position

       ③通過getView()實作局部的重新整理

點選事件

ListView實際是自帶點選事件的,可以直接調用API:onItemClickListener();onItemLongListener();onSelecterListener()

方法二:

①通過getItemId()傳回的id對用Item(此處不可以通過position,因為一旦有頭部和底部會出現越界的問題,在此處不建議使用)

②在Adapter中針對,每一個item寫在getView()方法中

空資料

具有處理空資料的方法setEmptyView()

RecyclerView

布局

不光可以實作縱向布局,還可以實作橫向,表格,瀑布流等布局。

緩存機制

四級緩存機制:支援多個離ItemView緩存,支援開發者自定義緩存處理邏輯,支援所有 RecyclerView共用同一個RecyclerViewPool(緩存池)。

mAttachedScrap:快速重用螢幕上可見的清單項,不需要重新createView和bindView;與ListView的mActiveViews作用一緻。

CachedViews + mReyclerViewPool:緩存離開螢幕的ItemView,目的是讓即将進入螢幕的ItemView重用與mScrapViews功能一緻。

mRecyclerPool可以供多個RecyclerView共同使用,在特定場景下,如viewpaper+多個清單頁下有優勢

mViewCacheExtension:需要使用者定制,預設情況下不實作,自定義擷取holder緩存

緩存:

View + ViewHolder(避免每次createView時調用findViewById) + flag(辨別狀态);

ListView和RecyclerView緩存的差別ListViewRecyclerViewListView和RecyclerView緩存機制對比:

重新整理:

局部重新整理notifyItemChanged

點選事件

隻有唯一的API:addOnItemTouchListener();

空資料

不含有處理空資料的方法,需要自己進行資料空的判斷

ListView和RecyclerView緩存機制對比:

1. 層級不同:

RecyclerView比ListView多兩級緩存,支援多個離ItemView緩存,支援開發者自定義緩存處理邏輯,支援所有RecyclerView共用同一個RecyclerViewPool(緩存池)。

ListView(兩級緩存):

ListView和RecyclerView緩存的差別ListViewRecyclerViewListView和RecyclerView緩存機制對比:

RecyclerView(四級緩存):

ListView和RecyclerView緩存的差別ListViewRecyclerViewListView和RecyclerView緩存機制對比:

ListView和RecyclerView緩存機制基本一緻:

1). mActiveViews和mAttachedScrap功能相似,意義在于快速重用螢幕上可見的清單項ItemView,而不需要重新createView和bindView;

2). mScrapView和mCachedViews + mReyclerViewPool功能相似,意義在于緩存離開螢幕的ItemView,目的是讓即将進入螢幕的ItemView重用.

3). RecyclerView的優勢在于a.mCacheViews的使用,可以做到螢幕外的清單項ItemView進入螢幕内時也無須bindView快速重用;b.mRecyclerPool可以供多個RecyclerView共同使用,在特定場景下,如viewpaper+多個清單頁下有優勢.客觀來說,RecyclerView在特定場景下對ListView的緩存機制做了補強和完善。

2.緩存不同:

1). RecyclerView緩存RecyclerView.ViewHolder,抽象可了解為:

View + ViewHolder(避免每次createView時調用findViewById) + flag(辨別狀态);

2). ListView緩存View。

RecyclerView中mCacheViews(螢幕外)擷取緩存時,是通過比對pos擷取目标位置的緩存,這樣做的好處是,當資料源資料不變的情況下,無須重新bindView:

而同樣是離屏緩存,ListView從mScrapViews根據pos擷取相應的緩存,但是并沒有直接使用,而是重新getView(即必定會重新bindView)