瀏覽安卓開發者官網的時候,發現google悄然推出了一個新的控件:ViewPager2 ,一看名稱就知道這是一個和咱們經常使用的 ViewPager 功能類似的控件,算是ViewPager的升級版吧。目前還只是推出了第一個預覽版,咱們能夠直接引入來使用了:android
implementation 'androidx.viewpager2:viewpager2:1.0.0-alpha04'
複製代碼
咱們先來看看有哪些功能和使用上的變化:developer.android.google.cn/jetpack/and… 新功能:面試
API的變更:小程序
FragmentStateAdapter替換了原來的 FragmentStatePagerAdapter性能優化
RecyclerView.Adapter替換了原來的 PagerAdapterbash
registerOnPageChangeCallback替換了原來的 addPageChangeListener 看了上面這些介紹,有一點比較吸引人的就是支持豎向滾動了,這是怎麼實現的呢?ViewPager2的源碼不長,咱們來簡單分析一下。架構
經過查看源碼得知,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<FragmentViewHolder> implements StatefulAdapter
複製代碼
這是一個包含FragmentManager和數據狀態恢復功能的RecyclerView.Adapter,具體實現能夠參看源碼。因此你們也能夠用TabLayout+ViewPager2+Fragment來實現聯動展現效果。
經過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只是第一個預覽版,還存在穩定性方面的問題,不建議你們引入到正式項目中來,嚐嚐鮮就好。
想學習更多Android知識,或者獲取相關資料請加入Android開發交流羣:1018342383。 有面試資源系統整理分享,Java語言進階和Kotlin語言與Android相關技術內核,APP開發框架知識, 360°Android App全方位性能優化。Android前沿技術,高級UI、Gradle、RxJava、小程序、Hybrid、 移動架構師專題項目實戰環節、React Native、等技術教程!架構師課程、NDK模塊開發、 Flutter等全方面的 Android高級實踐技術講解。還有在線答疑