關(guān)于NestedScrollView和Paging3一起使用的bug,其實(shí)更應(yīng)該說是NestedScrollView和RecyclerView一起使用時(shí)產(chǎn)生的“問題”。
Bug還原
使用NestedScrollview嵌套豎向的RecyclerView時(shí),同時(shí)使用Paging3分頁加載庫實(shí)現(xiàn)RecyclerView的分頁加載。NestScrollView最終導(dǎo)致Paging3分頁加載循環(huán)加載,即進(jìn)入頁面后,會(huì)不斷進(jìn)行分頁加載,直到所有頁面加載完成,快速連續(xù)的分頁加載導(dǎo)致頁面滑動(dòng)卡頓。

上圖中,NestedScrollView嵌套一個(gè)RecyclerView和其他控件,進(jìn)入頁面后,Paging3的adpter預(yù)設(shè)一頁8個(gè)Item,所以第一次應(yīng)只加載8個(gè)Item,只有當(dāng)屏幕滾動(dòng)到第8個(gè)Item時(shí)觸發(fā)分頁加載,事實(shí)上在進(jìn)入頁面后,就會(huì)不斷觸發(fā)Paging3的分頁加載,第二張圖顯示第9-16號(hào)Item被加載,之后每頁的Item都被分頁加載出來。
組件簡(jiǎn)介
NestedScrollView,即支持嵌套滑動(dòng)的ScrollView,被官方推薦和RecyclerView一起使用解決嵌套滑動(dòng)的問題,可以在NestedScrollView中嵌套R(shí)ecyclerView+其他控件,解決ScrollView會(huì)出現(xiàn)的滑動(dòng)沖突問題,但NestedScrollView本身就有很多問題,常見問題見NestedScrollView、RecycleView、ViewPager 等布局方面的常見問題匯總,及解決
Paging3,Android Jetpack的一部分,Paging庫可幫助您加載和顯示來自本地存儲(chǔ)或網(wǎng)絡(luò)中更大的數(shù)據(jù)集中的數(shù)據(jù)頁面。Paging庫其中一個(gè)功能就是“可配置的 RecyclerView 適配器,會(huì)在用戶滾動(dòng)到已加載數(shù)據(jù)的末尾時(shí)自動(dòng)請(qǐng)求數(shù)據(jù)”。
原因猜測(cè):
這個(gè)Bug的原因猜測(cè)一下很簡(jiǎn)單,就是被NestedScrllView嵌套的RecyclerView會(huì)一次性加載完所有的Item,即一次性走完所有Item的onCreateViewHolder(),同時(shí)Paging3的分頁加載條件是滑動(dòng)到最后幾個(gè)Item時(shí),進(jìn)行分頁加載,即在最后幾個(gè)Item執(zhí)行onCreateViewHolder()時(shí)加載新一頁的數(shù)據(jù),這就導(dǎo)致了一個(gè)NestedScrollView和Paging3循環(huán)加載的BUG:NestedScrollView自動(dòng)加載完一頁數(shù)據(jù),觸發(fā)paging3加載新一頁數(shù)據(jù),新的數(shù)據(jù)到來又出發(fā)NestedScrollerView自動(dòng)加載完一頁數(shù)據(jù),如此循環(huán),導(dǎo)致最終一次性把所有數(shù)據(jù)加載完畢。
解決方案
不使用NestedScrollView嵌套R(shí)ecyclerView
- 如果需要和RecyclerView一起滑動(dòng)的控件復(fù)雜度不高,推薦直接使用RecyclerView自己添加 Header和Footer
- 如果其它控件復(fù)雜度較高,推薦使用CoordinatorLayout+AppBarLayout+CollapsingToolbarLayout實(shí)現(xiàn)其他控件和RecyclerView的一起滑動(dòng)??梢园哑渌丶旁贑ollapsingToolbarLayout中,RecyclerView放在CoordinatorLayout中