ViewPager的升级版吧。目前还只是推出了第一个预览版,我们可以直接引入来使用了:
implementation 'androidx.viewpager2:viewpager2:1.0.0-alpha01'
我们先来看看有哪些功能和使用上的变化:
新功能:
支持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只是第一个预览版,还存在稳定性方面的问题,不建议大家引入到正式项目中来,尝尝鲜就好。
作者:大头呆
链接:https://www.jianshu.com/p/e754cbd2d329