緩存機(jī)制
ListView的RecycleBin機(jī)制
首先,你將會有一個view數(shù)組mActiveViews,還有一個ArrayList<View>的mScrapView,這兩個的作用有什么用呢。列表展示數(shù)據(jù)的時候,假設(shè)有十條數(shù)據(jù)在屏幕上面,其他數(shù)據(jù)都在屏幕外面(也就是用戶看不到的地方)。那么屏幕正在使用的這十條數(shù)據(jù)就會存儲在mActiveViews中,里面的View只能被獲取一次,如果移出屏幕后被廢棄的view就會到mScrapView(這個時候已經(jīng)沒有pos信息和數(shù)據(jù)信息了)。當(dāng)getview方法調(diào)用時,如果convertView不為空,就可以直接重用,從廢棄的view中獲得,但是要重新bindview。
這里引用Android ListView 與 RecyclerView 對比淺析—緩存機(jī)制的圖片來說明listview的獲取緩存過程

RecyclerView的緩存機(jī)制
RecyclerView有四級緩存,分別是mAttachedScrap(屏幕內(nèi)緩存),mCacheViews(屏幕外的緩存),mViewCacheExtensions(自定義緩存),mRecycledViewPool(緩存池)。
緩存過程就是當(dāng)我滑動屏幕時候,最近被移出屏幕外的viewholder就會放到mCacheViews上面,這個時候是含有pos信息和數(shù)據(jù)信息的,如果他滿了且沒有實現(xiàn)自定義緩存,就會把老的viewholder放到緩存池中,這個時候緩存池里面的是沒有數(shù)據(jù)信息的,如果你要復(fù)用的話就要重新bindview。
如果我要獲取緩存的話,就按順序來讀取,先去判斷mAttachedScrap有沒有,有的話直接拿來用,然后判斷mCacheViews,接著判斷自定義緩存。如果都沒有再去緩存池里判斷,沒有的話就createViewHolder,有的話就bindViewHolder。

布局
- ListView只能豎著布局
- RecyclerView可以提供線性布局,網(wǎng)格布局,瀑布流布局,也可以選擇豎著還是橫著