一、RecyclerView扩展(一)ViewPager2使用与原理浅析
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详解(四):LayoutManager布局管理器
LayoutManager是一个抽象类,有3个子类:
LinearLayoutManager:线性布局管理器 GridLayoutManager:表格布局管理器 StaggeredGridLayoutManager:瀑布流布局管理器
LinearLayoutManager是线性布局管理器,使用频率是最高的,展示的样式跟listview一模一样。该类有3个构造方法:
第一个构造方法内部调用了第二个构造方法,第二个构造方法参数的含义:
orientation也可以通过manger.setOritation()设置 reverseLayout,也可以通过manager.setReverseLayout()设置。 setStackFromEnd(boolean stackFromEnd)当设置为true时,列表便会从底部开始展示内容,RecycelrView会自动滑倒尾部。这个方法和manager.setReverseLayout(true)共同点就是都自动滑动尾部,RecyclerView默认会展示末尾的item。差别在于,manager.setStackFromEnd(true)不会影响内部的数据顺序,怎么添加进Adapter的,就怎么展示。
scrollToPosition(int position)滑动到指定item linearLayoutManager.scrollToPositionWithOffset(int position,int offset)滑动到指定item,在这个基础上,又附加偏移了offset的距离。
获取当前RecyclerView首尾可见item的位置方法
这4个方法,只有当RecyclerView在屏幕展示出来后,才能得到正常的返回值,否则都是-1
该管理器继承LinearLayoutManager,也有3个构造方法,由于是继承LiearLayoutMnager,使用起来差别不大,构造方法内使用了super()方法来直接调用了父类的构造方法:只是构造函数会多一个参数 spanCount:列数根据方法的注释,可以知道,默认情况下,GridLayoutManager是垂直的。在方法内,列数是调用setSpanCount(spanCount)进行设置。如果GridLayoutManager是水平的,则spanCount代表行数,这个还是很容易理解。 GridLayoutManager不支持setStackFromEnd(),但支持setReverseLayout(boolean)方法。其他LinearLayoutManager的方法在上面已经提过了,就不重复了。
这里我们spanCount设置为3,效果如下图
构造函数StaggeredGridLayoutManager(int spanCount, int orientation)意思和GridLayoutManager一样。使用也是一样。这边就不具体表现讲了,看效果
使用这3个布局管理器,差不多90%的需求都能满足吧,LayoutManager也可以自定义实现,后面有用在进行详细讨论,这边仅说简单的使用。
git地址: https://gitee.com/stonezry/AndroidDemo
三、关于RecyclerView
这篇毫无头绪,供个人查阅。
RecyclerView必知必会
抽丝剥茧RecyclerView-化整为零
RecyclerView的四大组成是:
Android中使用RecyclerView+ SnapHelper实现类似ViewPager效果
让你明明白白的使用RecyclerView——SnapHelper详解
Android SnapHelper扒皮分析
SnapHelper硬核讲解
用RecyclerView做一个小清新的Gallery效果,之前项目中也做过卡片滑动,过程中缩放的功能。
https://github.com/BCsl/GalleryLayoutManager,卡片滑动,过程中缩放的功能。
Android开发之分组列表悬浮顶部栏(吸顶效果)--做了offset的示意图,很直观。
ItemDecoration--比较简单,注意的四点:0、系统提供的默认的decoration;1、就是addItemDecoration方法,add会重复添加,自己做项目也遇到过;2、添加的decoration的点击问题;3、关于ViewGroup的onDraw()方法的调用问题
ItemDecoration实现方式,并带touch点击事件--点击事件的一个思路吧
自定义ItemDecoration这个问题你真的注意到了吗
RecyclerView系列之二ItemDecoration--几个例子
解决RecyclerView执行动画后item边距错误的问题
RecyclerView的滚动事件研究
三种方式实现RecyclerView的Item点击事件
RecycleView的findChildViewUnder()方法简单介绍
掌握自定义LayoutManager(一)系列开篇常见误区、问题、注意事项,常用API
学不动也要学!深入了解ViewPager2,实现(1)中卡片布局
官方 Viewpager升级版- ViewPager2实战
END,本文到此结束,如果可以帮助到大家,还望关注本站哦!