首页 理论教育 RecyclerView应用指南

RecyclerView应用指南

时间:2023-06-17 理论教育 版权反馈
【摘要】:本节引言RecyclerView出现已经有一段时间了,相信大家已不会感到不陌生了,大家可以通过导入support-v7对其进行使用。整体上看RecyclerView架构提供了一种插拔式的体验,具有高度的解耦与异常的灵活性,通过它提供的LayoutManager、ItemDecoration、ItemAnimator可实现令人满意的效果。RecyclerView的适配器需要重写,可以依照用户自己的需求修改。该方法的参数为RecyclerView.ItemDecoration,该类为抽象类,官方目前并没有提供默认的实现类。

RecyclerView应用指南

本节引言

RecyclerView出现已经有一段时间了,相信大家已不会感到不陌生了,大家可以通过导入support-v7对其进行使用。据官方的介绍,该控件用于在有限的窗口中展示大量数据集,其实具有这样功能的控件我们并不陌生,例如:ListView、GridView。那么有了ListView、GridView为什么还需要RecyclerView这样的控件呢?整体上看RecyclerView架构提供了一种插拔式的体验,具有高度的解耦与异常的灵活性,通过它提供的LayoutManager、ItemDecoration、ItemAnimator可实现令人满意的效果。

用户想要控制RecyclerView显示的方式,可通过布局管理器LayoutManager完成;

用户想要控制Item间的间隔(可绘制),可通过ItemDecoration完成;

用户想要控制Item增删的动画,可通过ItemAnimator完成。

1.RecyclerView使用注意事项

(1)首先需要导入RecyclerView。

在module的build.gradle中的dependencies {}中添加:

implementation 'com.android.support:recyclerview-v7:28.0.0'

此外,用户需注意版本控制。

(2)在布局文件使用RecyclerView布局。

(3)列表子项的布局,一定要注意,最外层的控件高度不是match_parent,而是子项需要有的高度,否则一个子项就会占据整个屏幕。子项布局里放任何控件都可以,在适配器里面,这些对象都是可以获取的,因此可随便设置。

(4)RecyclerView的适配器需要重写,可以依照用户自己的需求修改。

(5)Activity里的代码:使用RecyclerView的三部曲:获取recyclerView对象、添加布局管理器、添加适配器。适配器要重写,可以事先放入数据,也可以之后添加数据。注意,这里导入包是import android.support.v7.widget.RecyclerView,不要导入另一个。

2.使用RecyclerView代替ListView

(1)新建一个module,命名为RecyclerViewDemo。

(2)为RecyclerView的使用添加依赖:在module的build.gradle中的dependencies{}添加:

(3)准备12个头像图片,并导入至drawable文件夹下,见图2.20。

图2.20

(4)为项目增加相关资源,参考strings.xml代码:

(5)新建一个自定义布局文件item_layout.xml。

(6)布局文件activity_main.xml(注意非android核心控件的使用方法)。

(7)MainActivity.java。

(8)运行效果,见图2.21。

图2.21

3.给RecyclerView增加分割线

RecyclerView并没有支持divider这样的属性,但是用户可以自己定制分割线,也可以通过mRecyclerView.addItemDecoration()方法添加分割线。该方法的参数为RecyclerView.ItemDecoration,该类为抽象类,官方目前并没有提供默认的实现类。

该类的源代码如下:

当用户调用mRecyclerView.addItemDecoration()方法添加decoration的时候,采用RecyclerView绘制decorator,即调用该类的onDraw和onDrawOver方法。注:

onDraw方法先于drawChildren;

onDrawOver在drawChildren之后,通常用户可选择复写其中一个即可;

getItemOffsets 可以通过outRect.set()为每个Item设置一定的偏移量,主要用于绘制Decorator。

(1)接续上一案例,自定义RecyclerView.ItemDecoration的实现类MyItemDecorator extends RecyclerView.ItemDecoration,该类实现了为RecyclerView添加分割线,该类的代码MyItemDecorator.java如下:

(2)上面的实现类通过读取系统主题中的 Android.R.attr.listDivider作为Item间的分割线,并且支持横向和纵向。获取到listDivider以后,该属性的值是一个Drawable,在getItemOffsets中,outRect去设置了绘制的范围。onDraw中实现了真正的绘制。

在MainActivity.java中添加如下代码就可以完成绘制分割线,需要注意分割线的方向要和布局的方向配合,MainActivity.java部分代码如下:

(3)运行效果,见图2.22。

图2.22

(4)上面的分割线是系统默认的,用户可以在theme.xml中找到该属性的使用情况。那么,使用系统的listDivider有什么益处呢?益处是方便用户可根据自己的意愿进行变更处理。用户可以自己写一个drawable来替换系统默认的listDivider,在res\drawable文件夹下增加divider_my.xml,参考代码如下:

(5)在res\values\styles.xml文件中重新对listDivider进行声明,styles.xml参考代码如下:(www.xing528.com)

(6)运行效果,见图2.23。

图2.23

4.针对网格布局、交错网格布局增加分割线

改为GridLayoutManager以后,对于分割线,前面的MyItemDecorator就不适用了,主要是因为它在绘制的时候,比如水平线,针对每个child的取值为:

final int left = parent.getPaddingLeft();

final int right = parent.getWidth()- parent.getPaddingRight();

因为每个Item一行,这样是没问题的。而GridLayoutManager时,一行有多个childItem,这样就会出现需多次绘制,并且GridLayoutManager时,Item如果为最后一列(则右边无间隔线)或者为最后一行(底部无分割线)。针对上述,用户需要编写一个新的网格布局画分割线的类MyGridItemDecorator extends RecyclerView.ItemDecoration。

(1)接续上一案例,自定义MyGridItemDecorator extends RecyclerView.ItemDecoration,该类的代码MyGridItemDecorator.java如下:

(2)在MainActivity.java中添加部分代码就可以完成网格布局绘制分割线,代码如下:

(3)运行效果,见图2.24。

图2.24

(4)在MainActivity.java中添加如下代码就可以完成交错网格绘制分割线,代码如下:

(5)运行效果,见图2.25。

图2.25

5.针对item监听的改进

上面案例中已经实现了对item的监听。是在内部类MyAdapter中的onBindViewHolder()方法中实现的。

(1)接续上一案例,MainActivity.java部分代码如下:

(2)很显然,在内部类MyAdapter中处理item事件很不方便,如果需要改变item的事件处理需要修改内部类里的相关方法代码。因此希望MyAdapter能够给用户提供一个类似OnItemClickListener的接口,但内部类无法定义接口,因此有必要把MyAdapter改为外部类。MyAdapter.java参考代码如下(注意改为外部类后部分代码需要调整):

(3)修改后的MainActivity.java部分代码如下:

(4)运行效果,见图2.26。

图2.26

6.RecyclerView的item增删改移操作

(1)仍然延续上一案例,要实现item的增删改移操作,首先需要增加item的事件处理机制,上面案例已经实现了item的单击事件,再增加一个长按事件处理,如果需要进行多种不同操作,可以在长按事件里增加菜单,通过菜单选择进行多个不同的事件处理。

修改后的MyAdapter.java代码如下:

(2)修改后的MainActivity.java部分代码如下:

(3)运行效果,见图2.27。

图2.27

(4)上面已经添加了单击和长按事件的监听器,下面通过单击事件来实现数据修改,长按实现数据删除等。

RecyclerView具有高度自由性,其中一个原因也是它可以进行局部刷新,所以想往RecyclerView的Adapter中增、删、改、移数据是很方便的,官方API为用户提供了以下方法:

(5)为了便于进行item的操作,可以把每个item封装成为一个Person对象,对应的Person.java代码如下:

(6)在MyAdapter.java中增加使用Person数据集合绑定item的代码:

(7)使用Person集合设定item的MainActivity.java部分代码如下:

(8)在MyAdapter里增加增删改移的方法(这里只给出增加和删除的方法):

(9)MainActivity.java修改单击事件为增加一个item,长按事件为删除一个item,部分代码如下:

(10)运行效果,见图2.28、图2.29。

图2.28

图2.29

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈