Android RecyclerView学习笔记

概要

本文主要介绍用RecyclerView实现ListView、GridView和瀑布流效果视图,以及如何实现条目之间分割线并且进一步自定义分割线,最后给出了自定义监听器并简单实现了添加删除条目的操作。

RecyclerView是Android support-v7提供的新组件,虽然已经出现一段时间了,但是到目前为止我还是第一次用到,RecyclerView如果处理得当,可以十分容易的完成我们平常开发中ListView或GridView的常用功能,而且还可以很方面的实现瀑布流布局。既然是新组件,仅仅可以实现以前组件所实现的功能当然是不够的,在Android5.0版本的Material Design 中与CoordinatorLayout还可以实现一些酷炫的动画效果,这是ListView和GridView所不能匹敌的。

Android api中是这样描述RecyclerView的:

RecyclerView is a more advanced and flexible version of ListView. This widget is a container for large sets of views that can be recycled and scrolled very efficiently. Use the RecyclerView widget when you have lists with elements that change dynamically.

RecyclerView的由来

用于在有限的窗口范围内显示大量数据的控件,这就是RecyclerView的最重要的目的。ListView和GridView也都可以实现这些功能,他们都可以不用每次都创建新的View,而是回收重用原来已有的View,不用保存大量不可见视图,有效节省内存资源。但是在ListView或者GridView中他们在控制外观、回收过程和其他操作是紧耦合的,缺乏灵活性,这就是为什么谷歌要开发RecyclerView来取代它的意义所在。

RecyclerView本身不参与任何和视图相关的东西,它不关心如何将子View放在合适的位置,也不关心如何分割这些子View,更不关心每个子View各自的外观。进一步来说,RecyclerView只负责回收和重用的工作,这就是它名字的由来。

所有关于布局、绘制和其他相关的问题,也就是跟数据展示相关的所有问题,都被委派给了一些”插件化”的类来处理。这使得RecyclerView的API变得非常灵活。你需要一个新的布局么?接入另一个LayoutManager就可以了!你想要不同的动画么?接入一个新的ItemAnimator就可以了,诸如此类。

以下是RecyclerView中用于数据展示的一些重要的类,他们都是RecyclerView的内部类:

  • Adapter:包装数据集合并且为每个条目创建视图。
  • ViewHolder:保存用于显示每个数据条目的子View。
  • LayoutManager:将每个条目的视图放置于适当的位置。
  • ItemDecoration:在每个条目的视图的周围或上面绘制一些装饰视图。
  • ItemAnimator:在条目被添加、移除或者重排序时添加动画效果。

创建一个简单列表

Activity布局文件

Item中TextView的布局文件就不列出了,就是一文本TextView。

RecyclerView01

上述代码与ListView或者GridView使用并没有太大区别,唯一不同的是加入了一个布局管理器LayoutManager,下面对涉及到的各个类简单介绍一下。

RecyclerView.ViewHolder

ViewHolder的基本作用是缓存视图对象,Android官方很早就推荐使用ViewHolder的编程模式,但是现在使用这种模式将是强制性的。

RecyclerView.ViewHolder的子类都可以通过ViewHolder的public的成员变量itemView来访问每个条目的根视图,所以ViewHolder子类中不需要再保存这个视图。

RecyclerView.Adapter

Adapter充当两个角色:访问数据集合以及负责为每个条目创建正确的视图。Adapter在Android中经常出现,比如ListView、AutoCompleteTextView、Spinner等,他们都继承自AdapterView,但是RecyclerView并没有这样做。

对于RecyclerView,谷歌决定使用新的RecyclerView.Adapter基类来取代旧的Adapter接口。所以,SimpleCursorAdapter、ArrayAdapter都将成为历史,或者至少不会是他们现在的这种使用方式。

目前RecyclerView.Adapter还没有默认实现,以后可能会添加。由于RecyclerView.Adapter是一个抽象类,所以必须要实现以下三个方法:

其中VH是泛型类,当继承RecyclerView.Adapter时需要使用具体的类来替换。

RecyclerView.LayoutManager

LayoutManager可能是RecyclerView中最有趣的部分了,该类负责放置所有的子View到适当位置。该类有一个默认的实现:LinearLayoutManager,当要实现水平或垂直列表时可以使用该类。

除此之外还提供了GridLayoutManager和StaggeredGridLayoutManager管理器,这两个管理器在下面也将逐一介绍。

事实上如果想要使用RecyclerView,上面三个类就必须都得用到,如果再进行额外的渲染就必须使用其它的两个类了,如添加分割线使用ItemDecoration或者自定义添加删除动画ItemAnimator。

为列表添加分割线

上述代码摘自support v7包中的sample。

RecyclerView02

自定义分割线

在主题下设置如下:

item_divider的自定义实现:

RecyclerView03

实现GridView

文章前面已经说过了,如果想要什么布局,我们只需要设置setLayoutManager(LayoutManager layoutManager),这里我们也非常简单了。

DividerGridItemDecoration的具体实现方式可以下载示例源码查看,原理跟上面实现ListView时候的分割线一致,但是这里会有一个问题,就是如果列表都是可点击的,当我们触摸时会有一点的不尽如人意,效果图如下:

RecyclerView04

这种实现方式既然达不到我们的要求,那么我们看一下下面的这种实现方式:

RecyclerView05

如果下载了示例源码的人应该可以看出来,这种实现方式是在是太牛X了 ,核心实现代码就一行outRect.set(mItemOffset, mItemOffset, mItemOffset, mItemOffset)完美了实现了所要求的效果,而且跟原生的GridView十分的相像,一看到这种代码,感觉自己好像被甩了好几条街…

瀑布流效果

瀑布流效果跟上面所说的一样,只需要传入相应的 LayoutManager就可以了。

分割线设置跟实现GridView的方式一样。

RecyclerView06

水平滚动效果

无论实现ListView、GridView或者是瀑布流都可以很容易的实现水平滚动,只需要在默认布局管理器LayoutManager中传入一个参数就可以了。

上面构造方法orientation即是代表了滚动方向,默认都是垂直方向滚动的,reverseLayout是设置是否逆向布局,如果设置为true,则优先渲染尾部的布局。

不同View混排

在实现方式上跟ListView中实现混排的方式差不多,重点就是getItemViewType方法的实现。

RecyclerView07

Item点击事件以及添加删除视图

RecyclerView灵活性的同时也带来了一部分”问题”,它没有跟ListView或GridView一样的设置条码Item的点击事件。我们可以使用addOnItemTouchListener(listener)实现条目的监听事件,本文采用的是自定义监听器,我们上面已经说过了,每一个holder 的itemView会返回单个item的根视图,如果明白这个原理,我们实现接口回调自定义监听就容易明白多了。

对于添加和删除等的操作,RecyclerView.Adapter内置了相当丰富的操作,可以很容易的实现插入或删除操作,而且还附带动画效果,我们还可以自己通过setItemAnimator实现不同的自定义动画操作,github已经有大神提供了一些操作动画,可以拿来即用RecyclerViewItemAnimators

adapter

recycleview-10

小结

本篇博客也参考了大量网上的文章,今天所讲的仅限于对于常用api的介绍,当然了后面如果我们要实现下拉刷新或者上拉加载,以及更高级一点的功能,item之间的拖拽等等功能在以后的博客中再陆续介绍出来。

示例源代码下载

本文地址:www.sunnyang.com/315.html

参考资料

AndroidRecyclerviewGridLayoutManager列间距

RecyclerView初探

Android RecyclerView 使用完全解析 体验艺术般的控件

发表评论