android RecycledViewPool的作用詳解
一、先明確基礎(chǔ)概念
RecycledViewPool是什么?- 它是
RecyclerView的“緩存池”,專門存儲(chǔ)那些“暫時(shí)用不到但可能后續(xù)復(fù)用”的ViewHolder。當(dāng)ViewHolder從屏幕滑出,且超過(guò)mCachedViews(另一級(jí)緩存)的容量時(shí),會(huì)被轉(zhuǎn)移到這里“待命”。
- 它是
RecycledViewPool的默認(rèn)容量是多少?- 它的容量是按
viewType劃分的:默認(rèn)情況下,每種viewType最多緩存 5 個(gè)ViewHolder。 - 例如:如果列表有 2 種
viewType(類型 0 和類型 1),那么緩存池會(huì)為類型 0 最多存 5 個(gè),類型 1 最多存 5 個(gè),總?cè)萘渴?10 個(gè)(但按類型隔離)。
- 它的容量是按
viewType是什么?viewType是RecyclerView用來(lái)區(qū)分不同 Item 布局的標(biāo)識(shí)(由getItemViewType()方法返回)。不同viewType的ViewHolder不能互相復(fù)用(因?yàn)椴季植煌?。例如:文?Item(viewType=0)和圖片 Item(viewType=1)的ViewHolder無(wú)法混用。
二、為什么會(huì)“頻繁創(chuàng)建ViewHolder”?
核心原因是:RecycledViewPool 中對(duì)應(yīng) viewType 的緩存不夠用了,導(dǎo)致每次需要顯示新 Item 時(shí),都得重新創(chuàng)建 ViewHolder(調(diào)用 onCreateViewHolder)。
舉個(gè)例子:
假設(shè)你的列表有一個(gè)高頻出現(xiàn)的 viewType=0(比如 100 個(gè) Item 都是這個(gè)類型),而 RecycledViewPool 為 viewType=0 的默認(rèn)容量是 5 個(gè)。
- 當(dāng)快速滑動(dòng)列表時(shí),屏幕外會(huì)產(chǎn)生大量
viewType=0的ViewHolder,但緩存池最多只能存 5 個(gè)。 - 超過(guò) 5 個(gè)后,新滑出的
ViewHolder會(huì)被直接銷毀(因?yàn)榫彺娉貪M了)。 - 當(dāng)你往回滑時(shí),需要重新顯示這些
viewType=0的 Item,但緩存池里已經(jīng)沒(méi)有可用的了,只能重新創(chuàng)建ViewHolder,導(dǎo)致onCreateViewHolder頻繁調(diào)用,引發(fā)卡頓。
三、viewType和緩存池容量的關(guān)系
RecycledViewPool 的容量是按 viewType 獨(dú)立分配的,不同 viewType 的緩存互不干擾。這意味著:
- 如果某個(gè)
viewType的 Item 數(shù)量特別多(高頻出現(xiàn)),但緩存池為它分配的默認(rèn)容量(5 個(gè))不夠用,就會(huì)頻繁創(chuàng)建新ViewHolder。 - 反之,如果某個(gè)
viewType的 Item 很少(低頻出現(xiàn)),即使緩存池容量是 5 個(gè),也可能用不完(不會(huì)浪費(fèi))。
例如:
- 列表有兩種
viewType:viewType=0(90% 的 Item 都是它)和viewType=1(僅 10% 的 Item)。 - 默認(rèn)情況下,兩者各有 5 個(gè)緩存位。但
viewType=0的 Item 太多,5 個(gè)緩存根本不夠,導(dǎo)致頻繁創(chuàng)建;而viewType=1的 5 個(gè)緩存可能一直用不完。
四、為什么“調(diào)整RecycledViewPool容量”能解決問(wèn)題?
當(dāng)我們?yōu)楦哳l出現(xiàn)的 viewType 增大緩存容量(比如從默認(rèn) 5 個(gè)調(diào)到 10 個(gè)),意味著:
- 更多滑出屏幕的
ViewHolder能被存到緩存池里,而不是被銷毀。 - 當(dāng)再次需要顯示該類型的 Item 時(shí),能直接從緩存池里取到
ViewHolder復(fù)用,無(wú)需重新創(chuàng)建(減少onCreateViewHolder的調(diào)用)。
代碼示例:
// 為高頻出現(xiàn)的 viewType=0 擴(kuò)容到 10 個(gè)緩存 recyclerView.getRecycledViewPool().setMaxRecycledViews(0, 10);
這樣,viewType=0 的 ViewHolder 緩存容量從 5 變成 10,能容納更多暫時(shí)不用的 ViewHolder,大幅降低創(chuàng)建新實(shí)例的頻率。
總結(jié)
- 頻繁創(chuàng)建
ViewHolder的原因:高頻出現(xiàn)的viewType對(duì)應(yīng)的緩存池容量不足(默認(rèn) 5 個(gè)),導(dǎo)致滑出屏幕的ViewHolder被銷毀,再次需要時(shí)只能重新創(chuàng)建。 RecycledViewPool默認(rèn)容量:每種viewType最多緩存 5 個(gè)ViewHolder。- 與
viewType的關(guān)系:緩存池按viewType隔離,不同類型的ViewHolder不能復(fù)用,因此高頻類型需要更大的緩存容量。
通過(guò)為高頻 viewType 增大緩存池容量,能提升復(fù)用率,減少 ViewHolder 創(chuàng)建次數(shù),優(yōu)化列表滑動(dòng)性能。
到此這篇關(guān)于android RecycledViewPool的作用的文章就介紹到這了,更多相關(guān)android recycledviewpool內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android仿360市場(chǎng)下載按鈕的實(shí)現(xiàn)方法
這篇文章主要給大家介紹了關(guān)于利用Android實(shí)現(xiàn)360市場(chǎng)下載按鈕效果的方法,文中給出了詳細(xì)的示例代碼供大家參考學(xué)習(xí),并在文末給出了源碼供大家下載,需要的朋友們下面跟著小編一起來(lái)學(xué)習(xí)學(xué)習(xí)吧。2017-05-05
Android中使用Handler及Countdowntimer實(shí)現(xiàn)包含倒計(jì)時(shí)的閃屏頁(yè)面
這篇文章主要介紹了Android中使用Handler及Countdowntimer實(shí)現(xiàn)包含倒計(jì)時(shí)的閃屏頁(yè)面,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-03-03
Android?Java?try?catch?失效問(wèn)題及解決
這篇文章主要介紹了Android?Java?try?catch?失效問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11
掃二維碼下載apk并統(tǒng)計(jì)被掃描次數(shù)
本文主要對(duì)實(shí)現(xiàn)用戶掃描一個(gè)二維碼就能下載APP,并統(tǒng)計(jì)被掃描次數(shù)的方法進(jìn)行詳細(xì)介紹,具有一定的參考作用,下面跟著小編一起來(lái)看下吧2017-01-01
Android 仿摩拜單車共享單車進(jìn)度條實(shí)現(xiàn)StepView效果
這篇文章主要介紹了android 仿摩拜單車共享單車進(jìn)度條實(shí)現(xiàn)StepView效果的實(shí)例,通過(guò)定義五個(gè)狀態(tài),分別為:為完成、正在進(jìn)行、已完成、終點(diǎn)完成、終點(diǎn)未完成。具體實(shí)現(xiàn)代碼,大家參考下2017-03-03
在Android中實(shí)現(xiàn)根據(jù)手勢(shì)的圖片縮放功能
在移動(dòng)應(yīng)用開(kāi)發(fā)中,用戶界面的交互性是一個(gè)非常重要的方面,特別是對(duì)于圖片查看器類的應(yīng)用,能夠支持用戶通過(guò)簡(jiǎn)單的手勢(shì)來(lái)縮放圖片可以極大地提升用戶體驗(yàn),本文將介紹如何在Android應(yīng)用中實(shí)現(xiàn)基于手勢(shì)的圖片縮放功能,感興趣的小伙伴跟著小編一起來(lái)看看吧2025-07-07
Android自定義view 你所需要知道的基本函數(shù)總結(jié)
這篇文章主要介紹了Android自定義view 你所需要知道的基本函數(shù)的相關(guān)資料,需要的朋友可以參考下2017-02-02

