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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RecyclerView扩展(一)ViewPager2使用与原理浅析相关的知识,希望对你有一定的参考价值。

参考技术A

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 。

以上是关于RecyclerView扩展(一)ViewPager2使用与原理浅析的主要内容,如果未能解决你的问题,请参考以下文章

[转] Android PullToRefresh扩展RecyclerView

java 的ViewPage监听滑动到最后一页了

RecyclerView下拉刷新上拉加载

RecyclerView可扩展的cardView

自定义View 篇三 《手动打造ViewPage》

Android中Scrollview嵌套viewpage问题:viewpage设置非固定高点,按照自定义的scrollview 还是不能解决.