這兩天瀏覽安卓開發(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)目中來,嘗嘗鮮就好。