RecyclerView扩展(一)ViewPager2使用与原理浅析

 我来答
濒危物种1718
2022-06-25 · TA获得超过1.2万个赞
知道大有可为答主
回答量:6269
采纳率:100%
帮助的人:42.4万
展开全部

ViewPager2实际是内部的 RecyclerView 在起作用,所以ViewPager2一定要设置 RecyclerView.Adapter 赋值,并且Adapter的ItemView的布局必须为 match_parent 。才能正常使用。 ViewPager2+Fragment 提供了一个新的适配器 FragmentStateAdapter 。

FragmentStateAdapter实例

Activity中为Viewpager2初始化设置Adapter

以上就是ViewPager2的使用和属性设置,功能还是比较强大的,接下来看看Viewpager2的源码进行原理分析。

从ViewPager2的构造函数开始分析:

在ViewPager2的构造方法中都会调用 initialize 方法进行初始化,其中实例化了一让禅脊个封装的RecyclerView,并为这个RecyclerView设置了 layoutManager、OnScrollListener监听、SnapHelper 。

ScrollEventAdapter 直译意思是:滑动事件适配器。类如其名,它的作用就是将RecyclerView的滑动事坦渗件 适配成ViewPager2的OnPageChangeCallback的事件

ScrollEventAdapter作为一个 RecyclerView.OnScrollListener 的实例类。在监听RecyclerView的滑动状态的两个方法 onScrollStateChanged、onScrolled 中,根据不同的状态调用 dispatchStateChanged、dispatchSelected、dispatchScrolled 设配成ViewPager2的页面袭逗滑动接口 OnPageChangeCallback 。

PageTransformerAdapter 是 ViewPager2.OnPageChangeCallback 的实例类,作用是把 OnPageChangeCallback.onPageScrolled 的事件适配成 PageTransformer.transformPage() 事件。
先看看 PageTransformerAdapter 在ViewPager2被调用的地方:

PageTransformerAdapter的作用就是为ViewPager2的PageTransformer,在页面滑动的时候转换成PageTransformer. transformPage()。其中的transformPage(@NonNull View page, float position)方法的参数值可以参考这篇文章 PageTransformer详解 。ViewPager2如果想要实现页面之间的转换时动画可以重写 PageTransformer

FragmentStateAdapter 是谷歌为我们实现适配加载 Fragment 的 RecyclerView.Adapter ,如果我们想用ViewPager2加载Fragment页面,就可以继承 FragmentStateAdapter 作为适配器,只要重写其 构造方法 和 createFragment 、 getItemCount 。

这就是一个简易版的ViewPager2的FragmentAdapter。由此可见FragmentStateAdapter帮我们实现了Adapter的 onCreateViewHolder 、 onBindViewHolder 抽象方法。在 onCreateViewHolder 方法中创建了一个以 FrameLayout 为父类的View装载 Fragment 。

在重写的 onCreateViewHolder 方法中,通过 FragmentViewHolder.create 创建一个以 FrameLayout 为父容器的ItemView。
在重写的 onBindViewHolder 方法中,1. 先检测ItemView是否有加载过Fragment,如果加载过的Fragment与现在的Fragment不相同,则对ItemView和三个HashMap进行数据清空。2. 对两个HashMap设置新的数据。 3. 如果存在特殊情况,则当ItemView添加在到RecyclerView中才加载Fragment。

在ItemView依附在RecyclerView时,开始加载Fragment
具体能有多少个ItemView依附在RecyclerView中,取决于ViewPager2的缓存大小。

加载Fragment的流程在就在 placeFragmentInViewHolder 方法里,通过检查fragment和View的状态分别作出不同的操作。

关于ViewPager2的源码浅析就讲完了,下面总结一下:

ScrollEventAdapter 的作用:是将 RecyclerView的滑动事件 转换成 ViewPager2的OnPageChangeCallBack 。
PageTransformerAdapter 的作用:是将 RecyclerView的滑动事件 转换成 ViewPager2的PageTransformer 。
FragmentStateAdapter 的作用:是为ViewPager2加载 Fragment提供基础的Adapter 。

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
微测检测5.10
2023-05-10 广告
您好!建议咨 深圳市微测检测有限公司,已建立起十余个专业实验室,企业通过微测检测就可以获得一站式的测试与认 证解决方案;(EMC、RF、MFi、BQB、QI、USB、安全、锂电池、快充、汽车电子EMC、汽车手机互 联、语音通话质量),认证遇... 点击进入详情页
本回答由微测检测5.10提供
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式