想必大家對(duì)RecyclerView的4級(jí)緩存肯定都有所了解,那么RecyclerView為什么要是用4級(jí)緩存,每一級(jí)緩存在RecyclerView中都扮演了什么角色呢?
一級(jí)緩存 --> 減少綁定數(shù)據(jù)次數(shù)
RecyclerView 在滑動(dòng)過(guò)程中為了實(shí)現(xiàn)平滑的移動(dòng),每次移動(dòng)的距離都是10以下的像素,但是不管移動(dòng)了多少,只要快速的滑動(dòng),就要頻繁的遍歷數(shù)據(jù),但是如果數(shù)據(jù)遍歷完數(shù)據(jù)再重新bindData 就是一個(gè)非常要命的操作,一級(jí)緩存attachList 的作用就是在滑動(dòng)過(guò)程保存屏幕中有效的item 放入其中,那么在滑動(dòng)時(shí)從一級(jí)緩存中獲取的所有item的數(shù)據(jù)都是有效的,大大的保障了RecyclerView 滑動(dòng)過(guò)程中的平滑性
二級(jí)緩存 --> 減少剛剛從相同部分滑出屏幕,再劃入屏幕的item bindDate的次數(shù)
這個(gè)過(guò)程可以理解為,RecyclerView 向上滑動(dòng)時(shí),其中一個(gè)item 剛剛從一級(jí)緩存中被移除,此時(shí)RecyclerView 向下滑動(dòng)讓剛剛從一級(jí)緩存刪除的item 重新顯示在屏幕上,此時(shí)只需要遍歷二級(jí)緩存cacheList, 這個(gè)list大小只有2個(gè),而且遍歷他的時(shí)機(jī)是有item需要被替換的情況下,所以遍歷二級(jí)緩存的所消耗的代價(jià)還是相當(dāng)可以的
我們可以一起分析一下一級(jí)緩存和二級(jí)緩存
我們先假設(shè)一個(gè)item的高度為100 而每次滑動(dòng)的高度為10
在RecyclerView 向上快速滑動(dòng)的過(guò)程就是第一次滑動(dòng)10 將所有item 緩存到一級(jí)緩存 attachlist 中,反饋滑動(dòng)距離時(shí),由于沒(méi)有item 出現(xiàn)替換或者消失的情況,不會(huì)遍歷二級(jí)緩存,直接完整遍歷一級(jí)緩存即可完成本次滑動(dòng),直到 滑動(dòng)距離達(dá)到100,此時(shí)出現(xiàn)交替的情況下,假設(shè)二級(jí)緩存中存在數(shù)據(jù),那么則會(huì)遍歷二級(jí)緩存看看其中的數(shù)據(jù)是否和我們將要顯示的數(shù)據(jù)匹配,如果匹配,則不需要重新綁定數(shù)據(jù),如果不匹配則需要重新綁定數(shù)據(jù)
三級(jí)緩存 -->自定義緩存
第三級(jí)緩存是用來(lái)給復(fù)雜的操作用來(lái)做不同的緩存策略的,具體什么情況下能使用到這種緩存我也清楚,
四級(jí)緩存 --> 與listView 的viewholder 的用法一致,減少View inflate 的次數(shù)
其實(shí)在RecyclerView 中的第四級(jí)緩存從功能上整體上和ListView 的緩存是一致的,就是為了緩存View ,防止每次加載新的item再重新inflate 控件,他比ListView 強(qiáng)大之處就在可以讓多個(gè)RecyclerView 公用一個(gè)4級(jí)緩存池,來(lái)達(dá)到加速顯示的效果,我們還是以上一篇文章的圖片為例
讓所有的item公用一個(gè)緩存池必然會(huì)增加滑動(dòng)時(shí)的流暢度