歡迎光臨
每天分享高質量文章

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

作者:大頭獃

鏈接: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只是第一個預覽版,還存在穩定性方面的問題,不建議大家引入到正式專案中來,嘗嘗鮮就好。

 


●編號445,輸入編號直達本文

●輸入m獲取到文章目錄

推薦↓↓↓

 

Java編程

更多推薦25個技術類公眾微信

涵蓋:程式人生、演算法與資料結構、黑客技術與網絡安全、大資料技術、前端開發、Java、Python、Web開發、安卓開發、iOS開發、C/C++、.NET、Linux、資料庫、運維等

赞(0)

分享創造快樂