ViewPager2:官方Viewpager升級版來臨 [復制鏈接]

2019-5-19 22:00
大頭呆 閱讀:347 評論:1 贊:2
Tag:  

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

implementation 'androidx.viewpager2:viewpager2:1.0.0-alpha04'

我們先來看看有哪些功能和使用上的變化:https://developer.android.google.cn/jetpack/androidx/releases/viewpager2

新功能:

  • 支持RTL布局

  • 支持豎向滾動

  • 完整支持notifyDataSetChanged

API的變動:

  • FragmentStateAdapter替換了原來的 FragmentStatePagerAdapter

  • RecyclerView.Adapter替換了原來的 PagerAdapter

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


我來說兩句
您需要登錄后才可以評論 登錄 | 立即注冊
facelist
所有評論(1)
天明向日葵 2019-5-20 11:07
支持,加油
回復
作者的其他最新博客
領先的中文移動開發者社區
18620764416
7*24全天服務
意見反饋:[email protected]

掃一掃關注我們

Powered by Discuz! X3.2© 2001-2019 Comsenz Inc.( 粵ICP備15117877號 )

两码中特期期