這兩天瀏覽安卓開發者官網的時候,發現google悄然推出了一個新的控件:ViewPager2,一看名稱就知道這是一個和咱們經常使用的ViewPager功能類似的控件,算是ViewPager的升級版吧。目前還只是推出了第一個預覽版,咱們能夠直接引入來使用了:java
implementation 'androidx.viewpager2:viewpager2:1.0.0-alpha01'
複製代碼
咱們先來看看有哪些功能和使用上的變化:android
新功能:佈局
notifyDataSetChanged
API的變更:this
FragmentStateAdapter
替換了原來的 FragmentStatePagerAdapter
RecyclerView.Adapter
替換了原來的 PagerAdapter
registerOnPageChangeCallback
替換了原來的 addPageChangeListener
看了上面這些介紹,有一點比較吸引人的就是支持豎向滾動了,這是怎麼實現的呢?ViewPager2
的源碼不長,咱們來簡單分析一下。google
經過查看源碼得知,ViewPager2是直接繼承ViewGroup的,意味着和ViewPager不兼容,類註釋上也寫了它的做用是取代ViewPager,不太短時間內ViewPager應該還不會被廢棄掉。spa
繼續查看源碼,發現了兩個比較重要的成員變量:code
private RecyclerView mRecyclerView;
private LinearLayoutManager mLayoutManager;
複製代碼
因此很清楚得知,ViewPager2的核心實現就是RecyclerView
+LinearLayoutManager
了,由於LinearLayoutManager
自己就支持豎向和橫向兩種佈局方式,因此ViewPager2也能很容易地支持這兩種滾動方向了,而幾乎不須要添加任何多餘的代碼。xml
其實在此以前也不乏有大神采用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只是第一個預覽版,還存在穩定性方面的問題,不建議你們引入到正式項目中來,嚐嚐鮮就好。