ListView
1.繼承重寫BaseAdapter類
2.自定義ViewHolder與ConvertView的優化
布局
單一布局,隻可以實作縱向效果
緩存機制
兩級緩存
mActiveViews:快速重用螢幕上可見的清單項,不需要重新createView和bindView;
mScrapViews:緩存離開螢幕的ItemView,目的是讓即将進入螢幕的ItemView重用.
重新整理
通常情況下的重新整理都是全局重新整理(消耗資源) 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(辨別狀态);
重新整理:
局部重新整理notifyItemChanged
點選事件
隻有唯一的API:addOnItemTouchListener();
空資料
不含有處理空資料的方法,需要自己進行資料空的判斷
ListView和RecyclerView緩存機制對比:
1. 層級不同:
RecyclerView比ListView多兩級緩存,支援多個離ItemView緩存,支援開發者自定義緩存處理邏輯,支援所有RecyclerView共用同一個RecyclerViewPool(緩存池)。
ListView(兩級緩存):
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)