ViewPager 要被廢棄?官方 ViewPager2 升級版來臨

Java和Android架構發表於2019-03-02

640?wx_fmt=gif

熱文導讀|  點選標題閱讀

大專生質問馬雲:你說招聘從不看文憑,為什麼我投阿里石沉大海

真實靠譜:百度的職級、T系列、薪資、及晉升潛規則

Android Q (Android 10.0)系統新特性

轉自:大頭呆

https://www.jianshu.com/p/e754cbd2d329


從文件註釋來看ViewPager2確實是用來替代ViewPager 的,順帶解決之前ViewPager的一些問題,並且加入了 RTL,豎向滾動支援,下面一起來詳細看下吧。


ViewPager2 replaces ViewPager, addressing most of its predecessor’s pain-points, including right-to-left layout support, vertical orientation, modifiable Fragment collections, etc.

1、概述

這兩天瀏覽安卓開發者官網的時候,發現google悄然推出了一個新的控制元件:ViewPager2,一看名稱就知道這是一個和我們常用的ViewPager功能相似的控制元件,算是ViewPager的升級版吧。目前還只是推出了第一個預覽版,我們可以直接引入來使用了:


implementation 'androidx.viewpager2:viewpager2:1.0.0-alpha01'


https://developer.android.google.cn/reference/androidx/viewpager2/widget/ViewPager2


我們先來看看有哪些功能和使用上的變化:


新功能:


  • 支援RTL佈局

  • 支援豎向滾動

  • 完整支援notifyDataSetChanged


API的變動:


  • FragmentStateAdapter替換了原來的 FragmentStatePagerAdapter

  • RecyclerView.Adapter替換了原來的 PagerAdapter

  • registerOnPageChangeCallback替換了原來的 addPageChangeListener


看了上面這些介紹,有一點比較吸引人的就是支援豎向滾動了,這是怎麼實現的呢?ViewPager2的原始碼不長,我們來簡單分析一下。

2、簡單解析

通過檢視原始碼得知,ViewPager2是直接繼承ViewGroup的,意味著和ViewPager不相容,類註釋上也寫了它的作用是取代ViewPager,不過短時間內ViewPager應該還不會被廢棄掉。


繼續檢視原始碼,發現了兩個比較重要的成員變數:


private RecyclerView mRecyclerView;
private LinearLayoutManager mLayoutManager;


所以很清楚得知,ViewPager2的核心實現就是RecyclerView+LinearLayoutManager了,因為LinearLayoutManager本身就支援豎向和橫向兩種佈局方式,所以ViewPager2也能很容易地支援這兩種滾動方向了,而幾乎不需要新增任何多餘的程式碼。


其實在此之前也不乏有大神采用RecyclerView來實現輪播圖效果的,具體實現發生略有不同,但大體思想是一致的。這次ViewPager2的推出意味著這種方法終於被扶正了。


為了讓RecyclerView變得像原來的ViewPager,需要設定下SnapHelper:


 new PagerSnapHelper().attachToRecyclerView(mRecyclerView);


熟悉RecyclerView的同學都知道,SnapHelper用於輔助RecyclerView在滾動結束時將Item對齊到某個位置。PagerSnapHelper的作用讓滑動結束時使當前Item居中顯示,並且 限制一次只能滑動一頁,不能快速滑動,這樣就和viewpager的互動很像了。


另外和viewpager一樣,viewpager2可以承載fragment,我們需要繼承實現它提供的FragmentStateAdapter:


public abstract class FragmentStateAdapter extends
        RecyclerView.Adapter<FragmentViewHolderimplements StatefulAdapter


這是一個包含FragmentManager和資料狀態恢復功能的RecyclerView.Adapter,具體實現可以參看原始碼。所以大家也可以用TabLayout+ViewPager2+Fragment來實現聯動展示效果。

3、使用

通過android:orientation來指定滾動方向


<androidx.viewpager2.widget.ViewPager2
        android:id="@+id/viewpager2"
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:orientation="vertical" />


在程式碼中設定一個普通的RecyclerView.adapter:


ViewPager2 viewPager2=findViewById(R.id.viewpager2);
RecyclerviewAdapter adapter = new RecyclerviewAdapter(this);
viewPager2.setAdapter(adapter);


這樣豎直輪播圖就大功告成了。

小結

viewpager2利用recyclerview來實現viewpager的功能,無疑使使其可擴充套件性大大提升,程式碼也變得更優雅簡潔,使用起來也更靈活。不過目前viewpager2只是第一個預覽版,還存在穩定性方面的問題,不建議大家引入到正式專案中來,嚐嚐鮮就好。

看完本文有收穫?請分享給更多人

喜歡就點「好看」唄~

相關文章