ViewPager2:官方Viewpager升级版来临

这两天浏览安卓开发者官网的时候,发现google悄然推出了一个新的控件:ViewPager2,一看名称就知道这是一个和我们常用的ViewPager功能相似的控件,算是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只是第一个预览版,还存在稳定性方面的问题,不建议大家引入到正式项目中来,尝尝鲜就好。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏测试一般不一般

Android之APP安全测试篇

反编译 apk 文件,在AndroidManifest.xml 中查找Activity组件

16030
来自专栏镁客网

热点 | TensorFlow中国下载量突破200万,开源工具Firebase亮相,一文尽览2018谷歌开发者大会!

今日上午,2018谷歌开发者大会在上海举行。长达近两小时的大会中,谷歌重点介绍了其机器学习开源框架TensorFlow、Google Wear OS、Fireb...

7010
来自专栏前端资源

H5页面判断客户端是iOS或者Android并跳转对应链接唤起APP

每个客户端都会有自己的 UA (userAgent)标识,可以用 JavaScript 获取客户端标识。

28020
来自专栏Flink实战应用指南

[AI新知] Android版Google Maps开始支援无痕模式

Google宣称Maps用户启用无痕模式后,Google不会储存浏览/搜寻纪录以及传送通知,另一方面,由于系统不会取得位置纪录/地点资讯,用户也就无法获得个人化...

6010
来自专栏小詹同学

从6730个微信用户中分析出大家的手机使用习惯

老表,一个坚持学习的在校生,主要研究Python爬虫、数据分析、可视化、数据挖掘等,个人公众号:简说Python,欢迎关注一起学习。

7020
来自专栏Android 开发者

使用 Kotlin 构建的常见问题解答 | Kotlin 迁移指南 (下篇)

今年五月份的 Google I/O 上,我们正式向全球宣布 Kotlin-first 的这一重要理念,Kotlin 将成为 Android 开发者的首选语言,十...

11520
来自专栏Android 开发者

是时候迁移至 AndroidX 了 | AndroidDevSummit 中文字幕视频

如果您之前因为种种历史原因而选择暂不迁移至 AndroidX 的话,那现在是时候了。在本次演讲中 Nick Anthony 和 Tiem Song 为您详细阐...

11410
来自专栏音视频技术

快手高性能移动端多媒体引擎架构

大家好,我是陈彬,目前在快手负责短视频架构工作,主要负责构建快手的移动端多媒体引擎,提供短视频拍摄、编辑、发布等视频创作的基础能力,还有消费侧的播放器SDK和短...

5.9K40
来自专栏李蔚蓬的专栏

Android | AsyncTask基础梳理

8210
来自专栏Python无止境

Android 手机如何改造成 Linux 服务器?

自从没有了学生身份之后,购买云服务器的价格是越来越贵了,不管是阿里云还是腾讯云。我寻思着能不能找到什么替代品,这让我想起之前在知乎不经意看到的,可以把 Andr...

24320

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励