问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

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

发布网友 发布时间:2022-11-20 16:06

我来回答

1个回答

热心网友 时间:2024-11-17 05:13

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 。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
手机导航地图语音怎么下载 如何分别真金和仿金首饰 怎样区分真金和仿金首饰呢 小学生新年晚会主持人的串词!!(不要太多)急 大大后天就需要了!!!_百度... 周年晚会策划公司 奥格瑞玛传送门大厅在哪 奥格瑞玛传送门大厅怎么走 锻炼颈椎的几个动作 水多久能结冰 冰能在多长时间内形成 请问水低于0度会结冰吗? 如何防止脱发严重 RecyclerView详解(四):LayoutManager布局管理器 4.如何使用RecyclerView实现GridView的效果 秋天可以组什么词? 秋组词100个(秋组词) 秋天的秋怎么组词 秋天的秋如何组词 支付宝走访户籍地流程是什么 对老公心寒绝望的句子说说 对老公失望心酸发朋友圈 戴尔5000系列笔记本一休眠再玩就没声音怎么回事 山东千层馒头哪里正宗 1065795555是什么号码 为什么在梦里我真实的感受到死亡时的情景:连说话的力气都没有 很无... 智能刷卡水表怎么调整费率 为什么淘宝漫步者lollipop便宜 ...吃倍他乐克25mg伊那普利5mg半年,降到血压110140是不是不 血压110140严重吗可以 角铁做一个长方形切角怎么切 阮念初厉腾差几岁 这样的功放板线路可以使用多高的电压 对管是三肯的3858 1494 还有东芝... 那为大师帮忙解下这个三肯2SA1215、2SC2921功放板的详细接线!最好原图... 怎么样才算是2型糖尿病? 求大神讲解此图(霍尔电流传感器 电流采集电驴)的工作原理 谢谢了_百度... 中职电子商务主要学什么课程 家校合作的类型有哪些?(小学篇) 家长如何进行家校合作 如何进行家校合作 优港创意空间怎么样 竹子冬天怎么养护 竹子冬天应该如何养护 竹子冻了能缓过来吗 竹子安全越冬的措施 为什么我在Photoshop里用的特殊字体只对字母有效,文字却不行啊_百度... PS字体 求这种字体是什么 在广东,我一直觉得有一些小众秘境名字非常好听,比如“双月湾” 次月自动取消什么意思 Linux 下 AX210NGW 无线网卡安装驱动 如何训练写作 gitee不能求最大公约数 ...充电池用2A充电器充满电是16.38v,用1A的充电器充不进去了。但是用1... 怎么安装华为语音引擎的语音数据 汽车异响的原因 红外线电子体温计晋江哪里有卖。 电视突然花屏是什么故障?