×

RecyclerView详解

前端技术网 前端技术网 发表于2024-01-18 12:38:03 浏览2390 评论0

抢沙发发表评论

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

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

FragmentStateAdapter实例

RecyclerView详解

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。

RecyclerView详解

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,本文到此结束,如果可以帮助到大家,还望关注本站哦!