RecyclerView分為四級緩存
RecyclerView根據(jù)不同的狀態(tài)可以分為:屏幕內(nèi)緩存、屏幕外緩存敢朱、自定義緩存剪菱、緩存池。RecyclerView是通過內(nèi)部類Recycler來管理緩存拴签。
一級緩存:屏幕內(nèi)緩存(mAttachedScrap)
屏幕內(nèi)緩存指在屏幕中顯示的ViewHolder孝常,這些ViewHolder會緩存在mAttachedScrap、mChangedScrap中 :
- mChangedScrap 表示數(shù)據(jù)已經(jīng)改變的ViewHolder列表蚓哩,需要重新綁定數(shù)據(jù)(調(diào)用onBindViewHolder)
- mAttachedScrap 未與RecyclerView分離的ViewHolder列表
二級緩存:屏幕外緩存(mCachedViews)
用來緩存移除屏幕之外的 ViewHolder构灸,默認情況下緩存容量是 2,可以通過 setViewCacheSize 方法來改變緩存的容量大小岸梨。如果 mCachedViews 的容量已滿冻押,則會優(yōu)先移除舊 ViewHolder,把舊ViewHolder移入到緩存池RecycledViewPool 中盛嘿。
三級緩存:自定義緩存(ViewCacheExtension)
給用戶的自定義擴展緩存,需要用戶自己管理 View 的創(chuàng)建和緩存括袒,可通過Recyclerview.setViewCacheExtension()設(shè)置次兆。
四級緩存:緩存池(RecycledViewPool )
ViewHolder 緩存池,在mCachedViews中如果緩存已滿的時候(默認最大值為2個)锹锰,先把mCachedViews中舊的ViewHolder 存入到RecyclerViewPool芥炭。如果RecyclerViewPool緩存池已滿,就不會再緩存恃慧。從緩存池中取出的ViewHolder 园蝠,需要重新調(diào)用bindViewHolder綁定數(shù)據(jù)。
- 按照 ViewType 來查找 ViewHolder
- 每個 ViewType 默認最多緩存 5 個
- 可以多個 RecyclerView 共享 RecycledViewPool
RecyclerViewPool底層是使用了SparseArray來分開存儲不同ViewType的ViewHolder集合
緩存策略
Recyclerview在獲取ViewHolder時按四級緩存的順序查找痢士,如果沒找到就創(chuàng)建彪薛。其中只有RecycledViewPool找到時才會調(diào)用 onBindViewHolder,其它緩存不會重新bindViewHolder 。 流程如下 :
RecyclerView優(yōu)化
1.降低item的布局層次
降低item布局層級善延,可以減少界面創(chuàng)建的渲染時間少态,使用約束布局等。
2.去除冗余的setOnItemClick事件
直接在onBindViewHolder方法中創(chuàng)建一個匿名內(nèi)部類的方式來實現(xiàn)setOnItemClick是不可取的易遣,這會導(dǎo)致在RecyclerView快速滑動時創(chuàng)建很多對象彼妻,優(yōu)化方法為:事件的綁定和viewholder對應(yīng)的rootView進行綁定
3.復(fù)用pool緩存
如果存在RecyclerView中嵌套RecyclerView的情況,可以考慮復(fù)用RecyclerViewPool緩存池豆茫,減少開銷侨歉。
總結(jié)
通過了解RecyclerView的四級緩存,我們可以知道揩魂,RecyclerView最多可以緩存 N(屏幕最多可顯示的item數(shù)) + 2 (屏幕外的緩存) + 5*M (M代表M個ViewType幽邓,緩存池的緩存),只有RecycledViewPool找到時才會重新調(diào)用 onBindViewHolder肤京。