发布网友 发布时间: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 。