作者:大頭獃
連結: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<FragmentViewHolder> implements 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、資料庫、運維等