ViewPager2:官方Viewpager升級版來臨

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

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

我們先來看看有哪些功能和使用上的變化

新功能:

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

API的變動:

  • FragmentStateAdapter替換了原來的 FragmentStatePagerAdapter
  • RecyclerView.Adapter替換了原來的 PagerAdapter
  • registerOnPageChangeCallback替換了原來的 addPageChangeListener

看了上面這些介紹,有一點(diǎn)比較吸引人的就是支持豎向滾動了,這是怎么實(shí)現(xiàn)的呢?ViewPager2的源碼不長,我們來簡單分析一下。

簡單解析

通過查看源碼得知,ViewPager2是直接繼承ViewGroup的,意味著和ViewPager不兼容,類注釋上也寫了它的作用是取代ViewPager,不過短時(shí)間內(nèi)ViewPager應(yīng)該還不會被廢棄掉。

繼續(xù)查看源碼,發(fā)現(xiàn)了兩個(gè)比較重要的成員變量:

    private RecyclerView mRecyclerView;
    private LinearLayoutManager mLayoutManager;

所以很清楚得知,ViewPager2的核心實(shí)現(xiàn)就是RecyclerView+LinearLayoutManager了,因?yàn)?code>LinearLayoutManager本身就支持豎向和橫向兩種布局方式,所以ViewPager2也能很容易地支持這兩種滾動方向了,而幾乎不需要添加任何多余的代碼。

其實(shí)在此之前也不乏有大神采用RecyclerView來實(shí)現(xiàn)輪播圖效果的,具體實(shí)現(xiàn)發(fā)生略有不同,但大體思想是一致的。這次ViewPager2的推出意味著這種方法終于被扶正了。

為了讓RecyclerView變得像原來的ViewPager,需要設(shè)置下SnapHelper

    new PagerSnapHelper().attachToRecyclerView(mRecyclerView);

熟悉RecyclerView的同學(xué)都知道,SnapHelper用于輔助RecyclerView在滾動結(jié)束時(shí)將Item對齊到某個(gè)位置。PagerSnapHelper的作用讓滑動結(jié)束時(shí)使當(dāng)前Item居中顯示,并且 限制一次只能滑動一頁,不能快速滑動,這樣就和viewpager的交互很像了。

另外和viewpager一樣,viewpager2可以承載fragment,我們需要繼承實(shí)現(xiàn)它提供的FragmentStateAdapter

public abstract class FragmentStateAdapter extends
        RecyclerView.Adapter<FragmentViewHolder> implements StatefulAdapter

這是一個(gè)包含FragmentManager和數(shù)據(jù)狀態(tài)恢復(fù)功能的RecyclerView.Adapter,具體實(shí)現(xiàn)可以參看源碼。所以大家也可以用TabLayout+ViewPager2+Fragment來實(shí)現(xiàn)聯(lián)動展示效果。

使用

通過android:orientation來指定滾動方向

  <androidx.viewpager2.widget.ViewPager2
        android:id="@+id/viewpager2"
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:orientation="vertical" />

在代碼中設(shè)置一個(gè)普通的RecyclerView.adapter:

   ViewPager2 viewPager2=findViewById(R.id.viewpager2);
        
   RecyclerviewAdapter adapter = new RecyclerviewAdapter(this);
   viewPager2.setAdapter(adapter);

這樣豎直輪播圖就大功告成了。

小結(jié)

viewpager2利用recyclerview來實(shí)現(xiàn)viewpager的功能,無疑使使其可擴(kuò)展性大大提升,代碼也變得更優(yōu)雅簡潔,使用起來也更靈活。不過目前viewpager2只是第一個(gè)預(yù)覽版,還存在穩(wěn)定性方面的問題,不建議大家引入到正式項(xiàng)目中來,嘗嘗鮮就好。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android UI相關(guān)開源項(xiàng)目庫匯總OpenDigg 抽屜菜單MaterialDrawer ★7337 - 安卓...
    黃海佳閱讀 8,831評論 3 77
  • 這篇文章分三個(gè)部分,簡單跟大家講一下 RecyclerView 的常用方法與奇葩用法;工作原理與ListView比...
    LucasAdam閱讀 4,720評論 0 27
  • 容我興奮一下,哈哈~ 直到昨天晚上我才猛然發(fā)現(xiàn),已經(jīng)21天了。9月的尾聲,無意中看到弗蘭克老師的動手返現(xiàn)招募。挺猶...
    夢吉先生閱讀 271評論 0 0
  • 完全沒有想到,在2018年的末尾,干了一件這樣的事,好好反思一下自己,我覺得我應(yīng)該沉下心來,好好思考一下,自己面對...
    路過泡泡的小世界閱讀 328評論 0 0
  • emmmmm怎么說呢,這個(gè)腦洞,還是一如既往的清奇啊,雖然沒有《彩虹牙刷》的時(shí)候那么清奇…… 還是若無其事地把工口...
    一條污蚣閱讀 546評論 0 0

友情鏈接更多精彩內(nèi)容