隨著RecyclerView的廣泛使用,我們需要持續(xù)不斷對(duì)RecyclerView頁(yè)面進(jìn)行優(yōu)化蹋半,如果您想提高RecyclerView滾動(dòng)或滑動(dòng)的性能,必須要了解RecyclerView新特性:Prefetch
在滾動(dòng)和滑動(dòng)的時(shí)候充坑,RecyclerView需要顯示進(jìn)入屏幕的新item减江,這些item需要被綁定數(shù)據(jù)(如果緩存中沒有類似的item很可能還需要?jiǎng)?chuàng)建)染突,然后把它們放入布局并繪制。當(dāng)所有這些工作慢吞吞進(jìn)行的時(shí)候辈灼,UI線程會(huì)慢慢停下來(lái)等待其完成份企,然后渲染才能進(jìn)行,滾動(dòng)才能繼續(xù)巡莹。
google官方在 Support Library v25 版本中司志,為RecyclerView增加了Prefetch。
android 5.0以后降宅,android系統(tǒng)為了提高UI渲染的效率引入了RenderThread
骂远,在UI渲染過程中,主線程可以更加專注于跟用戶進(jìn)行交互腰根,而RenderThread
將通知GPU處理界面的繪制工作激才,這樣可以大大提高頁(yè)面流暢度,這就好比webview開啟硬件加速為了更快的渲染额嘿、畫布的一些繪制有時(shí)也需要開啟硬件加速等等瘸恼。
RecyclerView自帶的布局管理器有:LinearLayoutManager
、GridLayoutManager
册养、StaggeredGridLayoutManager
东帅,它們默認(rèn)支持Prefetch,當(dāng)然捕儒,我們可以手動(dòng)關(guān)閉Prefetch支持冰啃,代碼如下:
linearLayoutManager.setItemPrefetchEnabled(false);
setItemPrefetchEnabled
方法可以設(shè)置RecyclerView是否支持Prefetch
true:開啟Prefetch
false:關(guān)閉Prefetch
除了setItemPrefetchEnabled
之外,還有三個(gè)方法與Prefetch有關(guān)刘莹,分別是collectAdjacentPrefetchPositions
阎毅、collectInitialPrefetchPositions
、setInitialPrefetchItemCount
点弯。
- setInitialPrefetchItemCount:設(shè)置預(yù)取數(shù)量
- collectAdjacentPrefetchPositions:更新布局狀態(tài)扇调,并根據(jù)布局狀態(tài)設(shè)置預(yù)取位置
- collectPrefetchPositionsForLayoutState:根據(jù)布局狀態(tài)設(shè)置預(yù)取位置
- collectInitialPrefetchPositions:計(jì)算預(yù)取位置
當(dāng)重寫LayoutManager
時(shí),如果開啟了Prefetch抢肛,這四個(gè)方法需要重寫狼钮。至于怎么重寫等以后再補(bǔ)充吧。
當(dāng)使用系統(tǒng)自帶的LinearLayoutManager
捡絮、GridLayoutManager
熬芜、StaggeredGridLayoutManager
時(shí),默認(rèn)已經(jīng)支持Prefetch福稳,所以程序猿不需要做任何操作涎拉。
[本章完...]