正如前面说RecyclerView是更加灵活的ListView,尽管它引进了一些复杂的东西。我们都知道如何在app中使用ListView,并且如果想要提高ListView的性能,那么可以使用一种叫ViewHolder的模式。这个模式由一个简单类组成,它持有ListView中每一行所包含的UI组件的引用。这种模式避免列表显示的时候总是查找那些UI组件。尽管该模式引进了这点好处但我们仍可以不使用这种模式来实现ListView。而RecyclerView强制我们使用ViewHolder模式来提高系统的性能。为了说明如何使用RecyclerView,我们可以创建一个简单的app来显示通讯录卡片列表。第一件事就是创建主布局文件,RecyclerView很像ListView,我们可以用相同的方式来使用它们。
你应该注意到上面的layout了,RecycleView位于Android支持库中,所以我们要修改bulid.gradle文件来包含该依赖。
现在就可以在onCreate方法中我们来获取RecycleView的引用并且配置它。
你会注意到ReclerView与ListView的区别,RecycleView需要一个布局管理器,这个组件把列表项视图放到了行里面,来决定什么时候去循环视图。这个库提供了一个默认的布局管理器叫做LinearLayoutManager。
CardView UI组件在卡片里面显示更多信息。可以自定义它的圆角、阴影等效果。现在用这个组件来展示通讯信息。卡片将作为RecyclerView的行,稍后我们能看到如何集成这两个组件,现在来定义该卡片的布局。
正如你所看到的,CardView使用非常简单,这个组件在另外一个支持库中,现在来添加依赖:
适配器组件提供数据信息,UI组件渲染这些信息,换而言之,一个适配器告诉UI显示哪些信息。因此如果我们想显示通讯信息,我们需要给RecyclerView一个适配器。该适配器必须继承RecyclerView.Adapter。传递MyHolder类实现ViewHolder模式。
现在我们需要覆盖两个方法以至于能实现我们的逻辑。onCreateViewHolder会在新的ViewHolder实例创建的时候被调用,onBindViewHolder在SO试图绑定数据的时候调用,换句话说,数据显示在UI中时调用。
在这个案例中,适配器帮我们把RecyclerView和CardView结合,之前我们定义的卡片布局将作为RecyclerView的通讯录列表的行。在做这个之前,我们需要定义好数据模型(例如:哪些信息需要显示),为了达到这个目的,我们可以定义一个简单类:
最后,准备创建适配器,如果你还记得之前说过的ViewHolder模式的话,我们需要编写代码来实现它。
从代码中看出,在类的构造方法中,我们获取到了定义在卡片布局的试图的引用,现在编写适配器代码:
在代码实现中,绑定数据给试图的时候我们覆盖了onBindViewHolder。注意我们再没有去查找UI组件只是简单地引用存储在CcontactViewHolder中的信息。在onCreateViewHolder返回了ContactViewHolder填充布局的行(这个例子中的CardView)。
运行app,你会看到如下结果:

完整代码可以在github中查看
原文:A Guide to Android RecyclerView and CardView