ViewPager2
簡(jiǎn)單說就是將RecycleView再封裝了一遍墅冷,然后協(xié)同F(xiàn)ragmentStateAdapter將RecycleView的每個(gè)Item與Fragment綁定终议。
特性
支持從左到右祷舀,或者從上到下布局
由于適配基于的是RecyclerView.Adapter帜慢,所以內(nèi)存優(yōu)化也直接采用RecyclerView.Adapter的內(nèi)存優(yōu)化機(jī)制吻谋,相對(duì)于viewpager晒衩,內(nèi)存優(yōu)化更高效合理,且notifyDataSetChanged也更高效了欧引。由于不用開發(fā)者自己實(shí)現(xiàn)內(nèi)存和notifyDataSetChanged,也更簡(jiǎn)便了恳谎。?
相比ViewPager芝此,ViewPager2修復(fù)了不能關(guān)閉預(yù)加載和更新Adapter不生效的痛點(diǎn)。
目前ViewPager2對(duì)Fragment支持只能用FragmentStateAdapter因痛,F(xiàn)ragmentStateAdapter在遇到預(yù)加載時(shí)婚苹,只會(huì)創(chuàng)建Fragment對(duì)象,不會(huì)把Fragment真正的加入到布局中鸵膏,所以自帶懶加載效果膊升。
FragmentStateAdapter不會(huì)一直保留Fragment實(shí)例,回收的ItemView也會(huì)移除Fragment谭企,所以得做好Fragment重建后恢復(fù)數(shù)據(jù)的準(zhǔn)備廓译。
FragmentStateAdapter在遇到offscreenPageLimit>0時(shí)评肆,處理離屏Fragment和可見Fragment沒有什么區(qū)別,所以無法通過setUserVisibleHint判斷顯示與否非区。
基本方法
部分核心方法使用參照RecycleView和ViewPager瓜挽,如設(shè)置分割線addItemDecoration(),設(shè)置當(dāng)前項(xiàng)setCurrentItem()等征绸。
setAdapter() 設(shè)置適配器
setOrientation() 設(shè)置布局方向
setCurrentItem() 設(shè)置當(dāng)前Item下標(biāo)
beginFakeDrag() 開始模擬拖拽
fakeDragBy() 模擬拖拽中
endFakeDrag() 模擬拖拽結(jié)束
setUserInputEnabled() 設(shè)置是否允許用戶輸入/觸摸
setOffscreenPageLimit()設(shè)置屏幕外加載頁面數(shù)量
registerOnPageChangeCallback() 注冊(cè)頁面改變回調(diào)
setPageTransformer()?設(shè)置頁面滑動(dòng)時(shí)的變換效果
久橙。。管怠。還有好多淆衷。使用的時(shí)候大家可以具體看一下。
offscreenPageLimit()
不設(shè)置它則不會(huì)預(yù)加載排惨,一旦設(shè)置了吭敢,由于limit必須>0,所以會(huì)進(jìn)行預(yù)加載limit個(gè)頁面
viewpager2的預(yù)加載在加載時(shí)已經(jīng)準(zhǔn)備好了View布局暮芭,但是沒有加載到parent視圖上鹿驼,所以自帶懶加載效果。?而viewpager加載的時(shí)候View已經(jīng)添加到parent上辕宏。所以會(huì)走生命周期的方法畜晰。
從初始化方法可以看出,viewpager2支持的一些特性以及為什么瑞筐。
RecyclerViewImpl
基于RecyclerView的二次封裝,對(duì)觸摸事件聚假,初始化等進(jìn)行封裝块蚌。
LinearLayoutManagerImpl
使用LinearLayoutManager,所以擁有LinearLayoutManager的特性膘格,可以垂直或者水平峭范。也就引申出為什么后面可以設(shè)置水平或者垂直滑動(dòng)
PageTransformerAdapter
用于監(jiān)聽pager的改變。
基于RecyclerView.Adapter實(shí)現(xiàn)
類似recycleView的使用瘪贱。
基于FragmentStateAdapter實(shí)現(xiàn)