viewpager:
viewpager有2個弊端:
1.不能關閉預加載
2.更新adapter不生效
我們在加載數據的時候,viewpager默認會幫我們預加載前后兩個頁面的數據,並且這2個view是不可見的。
由於viewpager對offscreenPageLimit做了限制,默認設置為1,因此頁面的預加載不可避免。這也容易造成資源浪費。
一般使用viewpager與frament配合使用,利用fragment的setUserVisibleHint方法,來實現控制數據懶加載。而布局只能提前進入(預布局)。
viewPager2:
離屏加載與預加載:
ViewPager2的預加載與離屏加載在view層面有着本質的區別,離屏加載的view已經添加到parent上,而預加載只是准備了布局,並沒有加載到parent上。
1.ViewPager2默認是開啟預加載關閉離屏加載的,可能會預加載一條數據,而離屏加載即設置offscreenPageLimit為0。
2.ViewPager2設置offscreenPageLimit為1時,在第1頁會加載2條數據,每滑動一頁,都會加載下一頁數據,直到第五頁,會移除第一頁數據。
總結:
針對此次的更新,ViewPager2主要有以下一些特性:
1.目前ViewPager2對Fragment支持只能用FragmentStateAdapter,FragmentStateAdapter在遇到預加載時,只會創建Fragment對象,不會把Fragment真正的加入到布局中,所以自帶懶加載效果;
2.FragmentStateAdapter不會一直保留Fragment實例,回收的ItemView也會移除Fragment,所以得做好Fragment重建后恢復數據的准備;
3.FragmentStateAdapter在遇到offscreenPageLimit>0時,處理離屏Fragment和可見Fragment沒有什么區別,所以無法通過setUserVisibleHint判斷顯示與否。
參考: