ViewPager 要被废弃?官方ViewPager2升级版来临

Android setMaxLifecycle和BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT浅析 最近公司动荡,我在的项目受大环境影响收益每年下滑,可能要领盒饭了,所以最近都在复习相关基础内容,毕竟小脑袋瓜会忘记以前学过的东西。在ViewPager和Fragment的懒加载中,具体的原理是怎么样的呢?为什么能只执行显示的Fragment的onResume方法?疑问一:设置STARTED后是否执行onResume?那是否能交互?疑问二:FragmentPagerAdapter如果设置STARTED的话,就不会执行到onResume方法,懒加载就无法实现,更没有降级一说? 阅读详情

作者:大头呆

链接:

https://www.jianshu.com/p/e754cbd2d329

本文由作者授权发布。

 

从文档注释来看ViewPager2确实是用来替代ViewPager 的,顺带解决之前ViewPager的一些问题,并且加入了 RTL,竖向滚动支持,下面一起来详细看下吧。

 

ViewPager2 replaces ViewPager, addressing most of its predecessor’s pain-points, including right-to-left layout support, vertical orientation, modifiable Fragment collections, etc.

 

1

概述

 

这两天浏览安卓开发者官网的时候,发现google悄然推出了一个新的控件:ViewPager2,一看名称就知道这是一个和我们常用的ViewPager功能相似的控件,算是ViewPager的升级版吧。目前还只是推出了第一个预览版,我们可以直接引入来使用了:

 

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

 

https://developer.android.google.cn/reference/androidx/viewpager2/widget/ViewPager2

 

我们先来看看有哪些功能和使用上的变化:

 

新功能:

 

  • 支持RTL布局

  • 支持竖向滚动

  • 完整支持notifyDataSetChanged

 

API的变动:

 

  • FragmentStateAdapter替换了原来的 FragmentStatePagerAdapter

  • RecyclerView.Adapter替换了原来的 PagerAdapter

  • registerOnPageChangeCallback替换了原来的 addPageChangeListener

 

看了上面这些介绍,有一点比较吸引人的就是支持竖向滚动了,这是怎么实现的呢?ViewPager2的源码不长,我们来简单分析一下。

 

2

简单解析

 

通过查看源码得知,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来实现联动展示效果。

 

3

使用

 

通过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只是第一个预览版,还存在稳定性方面的问题,不建议大家引入到正式项目中来,尝尝鲜就好。

             

PS:如果有谁愿意深入解析,示例对比演示等,欢迎火速联系我,投稿分享给大家。

Fragmentation如何兼容新版本的setMaxLifecycle 看这篇文章前,大家应该先对setMaxLifecycle有所了解。 上年年末,谷歌为新版本的Fragment添加了控制其在ViewPager中的生命周期的新方式——setMaxLifecycle(而ViewPager2中默认且只有这个方式)。 听说后面还要把onActivityCreated砍了,注意下。 setMaxLifecycle的添加,简化了ViewPager在切换对Fragment可见性... 阅读详情

相关推荐

Android ViewPager2 核心原理与工业级实践教程

ViewPager2 是 Android 中用于实现页面级滑动容器的关键组件,其本质是一个轻量级页面调度器,而非简单的滑动视图。它通过 offscreenPageLimit 控制预加载范围、FragmentStateAdapter 管理生命周期复用、viewLifecycleOwner 实现精准懒加载,构建起页面状态持久化与性能平衡的技术闭环。相比传统 RecyclerView 嵌套或手动 GestureDetector 方案,ViewPager2 提供了标准化的页面生命周期解耦、TabLayout 联动支

453

Android基础之Fragment | setMaxLifecycle | 延迟加载 | 实例 | 带源码地址

Android基础之Fragment | setMaxLifecycle | 延迟加载 | 懒加载 | 实例 | 带源码地址 | 学习第一行代码的进阶之路

Qricis的博客 1793

Android新特性解析:setMaxLifecycle详解

如果当前状态是STARTED,调用setMaxLifecycle(Lifecycle.State.RESUMED)将将MyFragment的最大生命周期状态设置为RESUMED。然而,有时候我们需要在特定的情况下控制组件的生命周期,例如在某些条件下延迟组件的销毁或停止。借助setMaxLifecycle,开发者可以更灵活地管理组件的生命周期,提高应用程序的性能和响应能力。通过使用setMaxLifecycle方法,开发者可以根据应用程序的需求动态控制组件的生命周期状态。

CyberJolt的博客 646

Fragment新功能,setMaxLifecycle了解一下

前言 写上一篇ViewPager2软文时,我发现最新的Fragment代码淘汰了setUserVisibleHint方法,转而支持用setMaxLifecycle方法,setMaxLifecycle言外之意是设置最大生命周期,懂行的人应该知道,Fragment一直都是无法直接设置生命周期,必须通过add、attach、remove、detach、show、hide方法间接干预,本来就此功能,简单介...

weixin_34008933的博客 1464

PSIM+PIL+CCS三剑客:手把手教你搞定DSP28335的软硬件联合调试

本文详细介绍了如何利用PSIM、PIL与CCS三款工具,实现DSP28335的软硬件联合调试。通过搭建兼容环境、从PSIM仿真生成PIL代码,再到实战联合调试与问题诊断,手把手指导开发者构建从虚拟模型到实际硬件的完整验证闭环,有效提升电力电子与电机驱动等领域的开发效率与可靠性。

weixin_29183637的博客 186

手把手教你解决Realsense D455在ROS下IMU数据不输出的问题(附固件降级指南)

本文详细解析了Realsense D455在ROS环境下IMU数据不输出的问题,提供了固件降级和ROS配置的完整解决方案。通过版本兼容性分析和实战操作指南,帮助开发者快速恢复IMU数据流,优化机器人开发体验。

weixin_42531494的博客 371

ViewPager 要被废弃?官方 ViewPager2 升级版来临

热文导读|点击标题阅读大专生质问马云:你说招聘从不看文凭,为什么我投阿里石沉大海真实靠谱:百度的职级、T系列、薪资、及晋升潜规则Android Q (Android ...

Java和Android架构 2702

光耦继电器电路分析

光耦电路的分析笔记

MingYue_SSS的博客 6875

viewpager使用_ViewPager 要被废弃?官方 ViewPager2 升级版来临

(给安卓开发精选加星标)转自:大头呆https://www.jianshu.com/p/e754cbd2d329从文档注释来看ViewPager2确实是用来替代ViewPager 的,顺带解决之前ViewPager的一些问题,并且加入了 RTL,竖向滚动支持,下面一起来详细看下吧。ViewPager2 replaces ViewPager, addressing most of its ...

weixin_40005542的博客 427

Matlab实战:用卡尔曼滤波搞定无人机GPS轨迹优化(附完整代码)

本文详细介绍了如何使用Matlab实现卡尔曼滤波(KF)算法优化无人机GPS轨迹,提供完整代码和工程实践指南。通过线性卡尔曼滤波技术,有效降低定位噪声,提升轨迹平滑度,适用于无人机导航和控制系统开发。

weixin_29061425的博客 253

使用安卓的IMU数据进行 行人航位推算(PDR)推算步长 附python 代码

加速度计数据、陀螺仪数据、重力传感器数据、姿态仰角数据。数据分析与定位轨迹生成主要使用Python离线完成。示意图。

三维点云技术探索 1914

android中fragment嵌套viewpager_ViewPager 要被废弃?官方 ViewPager2 升级版来临

热文导读|点击标题阅读大专生质问马云:你说招聘从不看文凭,为什么我投阿里石沉大海真实靠谱:百度的职级、T系列、薪资、及晋升潜规则Android Q (Android 10.0)系统新特性转自:大头呆https://www.jianshu.com/p/e754cbd2d329从文档注释来看ViewPager2确实是用来替代ViewPager 的,顺带解决之前ViewPager的一些问题...

weixin_32821813的博客 693

2026年北京君正数字IC笔试试卷带答案

本文摘要:该文档是一份数字IC设计相关的考试试题,包含单选题、多选题、波形分析题和代码设计题。内容涵盖时序约束、半导体工艺、状态机设计、逻辑综合、异步FIFO设计等知识点。试题解析详细,重点考察数字电路基础、时序分析和Verilog代码实现能力。典型题目包括多周期路径设置、Moore/Mealy状态机区别、同步复位与异步复位特性、RISC-V架构特点等,并提供了异步FIFO的Verilog实现参考代码。(149字)

Open 112

ViewPager2:官方Viewpager升级版来临

这两天浏览安卓开发者官网的时候,发现google悄然推出了一个新的控件:ViewPager2 ,一看名称就知道这是一个和我们常用的 ViewPager 功能相似的控件,算是ViewPager的升级版吧。目前还只是推出了第一个预览版,我们可以直接引入来使用了: implementation 'androidx.viewpager2:viewpager2:1.0.0-alpha04' 我们先来看看有...

Android 开发架构 1687

解决宿主机Ping不通虚拟机的问题

在使用虚拟机的过程中,我们常常会遇到宿主机和虚拟机之间无法相互通信的问题。具体来说,我们要查看虚拟机和宿主机的 IP 地址,然后尝试进行 Ping 测试。在某些情况下,我们可能发现 Ping 虚拟机不通,接下来我将分享如何解决这个问题。

howard2005的专栏 7万+

【YOLOv8改进[Conv]】使用OREPA助力V8更优秀

使用OREPA助力V8更优秀,降低训练成本,在不引入任何推理时间成本的情况下提高深度模型的性能。

静谧、淡雅 1917

在fragment中使用viewpager_ViewPager2:官方Viewpager升级版来临

浏览安卓开发者官网的时候,发现google悄然推出了一个新的控件:ViewPager2 ,一看名称就知道这是一个和我们常用的 ViewPager 功能相似的控件,算是ViewPager的升级版吧。目前还只是推出了第一个预览版,我们可以直接引入来使用了:implementation 'androidx.viewpager2:viewpager2:1.0.0-alpha04'我们先来看看有哪些功能和使...

weixin_39969881的博客 1211

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

viewpager使用_ViewPager2:官方Viewpager升级版来临

这两天浏览安卓开发者官网的时候,发现google悄然推出了一个新的控件:ViewPager2 ,一看名称就知道这是一个和我们常用的 ViewPager 功能相似的控件,算是ViewPager的升级版吧。目前还只是推出了第一个预览版,我们可以直接引入来使用了:implementation'androidx.viewpager2:viewpager2:1.0.0-alpha04'我们先来看...

weixin_39765625的博客 244

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

【Android】Fragment将废弃onActivityCreated

androidX的fragment刚发布了最新版本1.3.0-alpha2 androidx.fragment:fragment:1.3.0-alpha02 androidx.fragment:fragment-ktx:1.3.0-alpha02 其中带来几个重要更新: 支持Activity Result APIs Added support for the ActivityResult...

移动端开发干货分享 7612

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

厉害了,2019-2020中国互联网趋势报告

热文导读|点击标题阅读ViewPager 要被废弃?官方 ViewPager2 升级版来临真实靠谱:百度的职级、T系列、薪资、及晋升潜规则Android Q (And...

Java和Android架构 2642

【Debug-singleLine】android:singleLine="true"已被废弃问题

Bug描述 有一个界面,外层是ViewPager,内层嵌了一个RecyclerView。RecyclerView有自己的点击和滑动事件,造成外层的ViewPager无法左右滑动。 山重水复 尝试了很多方法,比如可能是外层的ViewPager和内层的RecyclerView有滑动冲突的问题。于是想方设法拦截其中的某项事件监听,但并无卵用。最后折腾半天无果,无奈,按照项目的写法逻辑重新实现了一遍...

dandelionela的博客 2833

ViewPager2和Fragment可见性及懒加载解决方案

ViewPager2和Fragment新的可见性及懒加载解决方案,旨在解决ViewPager(ViewPager2)只有当前Fragment唯一可见时候网络刷新或绘图。注意:过去的setUserVisibleHint()已被废弃,开发者不要再使用基于setUserVisibleHint()解决Fragment可见性和懒加载(或延迟加载)的场景。新方案用最新的ViewPager2替代过去旧版的ViewPager,再结合Fragment的resume和pause生命周期实现。 写一个demo例子,测试的主类M

Zhang Phil 7714

ViewPager或ViewPager2调用 setCurrentItem(position) 不触发 onPageSelected 回调

ViewPager和ViewPager2使用setCurrentItem()时onPageSelected回调不触发的解决方案 摘要:使用ViewPager或ViewPager2时,setCurrentItem()不触发onPageSelected回调通常由四种原因导致:监听器注册时机不当、目标位置与当前页相同、ViewPager2接口差异或页面未初始化完成。解决方案包括:1)确保先注册监听器再调用setCurrentItem;2)处理位置相同时手动触发回调;3)使用post延迟确保页面初始化完成;4)避免

chuyouyinghe的专栏 504

ViewPager2与FragmentStateAdapter的现代化实践

本文详细介绍了ViewPager2与FragmentStateAdapter在Android开发中的现代化实践。通过对比传统ViewPager,展示了ViewPager2在垂直滑动、内存管理和RTL布局支持等方面的优势,并提供了从基础配置到高级优化的完整实现方案,帮助开发者提升应用性能和用户体验。

weixin_32667955的博客 266
上一篇: retrywhen实现重连(kotlin)
下一篇: android中内存泄露,内存溢出,内存优化的一些理解及心得
ZyClient
博客等级 码龄10年 29粉丝 60原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值