ViewPager2:官方Viewpager升級版來臨

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

implementation 'androidx.viewpager2:viewpager2:1.0.0-alpha04'
複製代碼

咱們先來看看有哪些功能和使用上的變化:developer.android.google.cn/jetpack/and… 新功能:面試

  • 支持RTL佈局
  • 支持豎向滾動
  • 完整支持notifyDataSetChanged

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高級實踐技術講解。還有在線答疑

相關文章
相關標籤/搜索