来源 http://jinyudong.com/2014/11/13/Introduce-RecyclerView-%E4%B8%80/

编辑推荐:稀土掘金,这是一个针对技术开发者的一个应用,你可以在掘金上获取最新最优质的技术干货,不仅仅是Android知识、前端、后端以至于产品和设计都有涉猎,想成为全栈工程师的朋友不要错过!

这篇文章是根据官网的一篇文章(这里)写的,不过作者增加了一些自己的理解,我十分推崇这种方式,而不是死板的翻译官网的文档,国内技术文章翻译的最差的地方在于:翻译出来的句子还保留着英语的语序。

RecyclerView 是Android L版本中新添加的一个用来取代ListView的SDK,它的灵活性与可替代性比listview更好。接下来通过一系列的文章讲解如何使用RecyclerView,彻底抛弃ListView.

介绍

RecyclerView与ListView原理是类似的:都是仅仅维护少量的View并且可以展示大量的数据集。RecyclerView用以下两种方式简化了数据的展示和处理:

  • 使用LayoutManager来确定每一个item的排列方式。

  • 为增加和删除项目提供默认的动画效果。

你也可以定义你自己的LayoutManager和添加删除动画,RecyclerView项目结构如下:

  • Adapter:使用RecyclerView之前,你需要一个继承自RecyclerView.Adapter的适配器,作用是将数据与每一个item的界面进行绑定。

  • LayoutManager:用来确定每一个item如何进行排列摆放,何时展示和隐藏。回收或重用一个View的时候,LayoutManager会向适配器请求新的数据来替换旧的数据,这种机制避免了创建过多的View和频繁的调用findViewById方法(与ListView原理类似)。

目前SDK中提供了三种自带的LayoutManager:

  • LinearLayoutManager

  • GridLayoutManager

  • StaggeredGridLayoutManager

第一节、简单的RecyclerView使用方法

本节所示示例是一个最简单的使用方法,在接下来几节中将会介绍更多RecyclerView的别的一些屌爆的用法。作者用的环境是Android Studio 0.8.6。

1、添加依赖

在AS的build.gradle中添加依赖,然后同步一下就可以引入依赖包:

  1. dependencies {
  2. ...
  3. compile 'com.android.support:recyclerview-v7:21.0.+'
  4. }

2、编写代码

添加完依赖之后,就开始写代码了,与ListView用法类似,也是先在xml布局文件中创建一个RecyclerView的布局:

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. tools:context=".MainActivity">
  6. <android.support.v7.widget.RecyclerView
  7. android:id="@+id/my_recycler_view"
  8. android:layout_width="match_parent"
  9. android:layout_height="match_parent"
  10. android:scrollbars="vertical"/>
  11. </RelativeLayout>

创建完布局之后在MainActivity中获取这个RecyclerView,并声明LayoutManagerAdapter,代码如下:

  1. mRecyclerView = (RecyclerView)findViewById(R.id.my_recycler_view);
  2. //创建默认的线性LayoutManager
  3. mLayoutManager = new LinearLayoutManager(this);
  4. mRecyclerView.setLayoutManager(mLayoutManager);
  5. //如果可以确定每个item的高度是固定的,设置这个选项可以提高性能
  6. mRecyclerView.setHasFixedSize(true);
  7. //创建并设置Adapter
  8. mAdapter = newMyAdapter(getDummyDatas());
  9. mRecyclerView.setAdapter(mAdapter);

接下来的问题就是Adapter的创建:

  1. public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
  2. public String[] datas = null;
  3. public MyAdapter(String[] datas) {
  4. this.datas = datas;
  5. }
  6. //创建新View,被LayoutManager所调用
  7. @Override
  8. public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
  9. View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item,viewGroup,false);
  10. ViewHolder vh = new ViewHolder(view);
  11. return vh;
  12. }
  13. //将数据与界面进行绑定的操作
  14. @Override
  15. public void onBindViewHolder(ViewHolder viewHolder, int position) {
  16. viewHolder.mTextView.setText(datas[position]);
  17. }
  18. //获取数据的数量
  19. @Override
  20. public int getItemCount() {
  21. return datas.length;
  22. }
  23. //自定义的ViewHolder,持有每个Item的的所有界面元素
  24. public static class ViewHolder extends RecyclerView.ViewHolder {
  25. public TextView mTextView;
  26. public ViewHolder(View view){
  27. super(view);
  28. mTextView = (TextView) view.findViewById(R.id.text);
  29. }
  30. }
  31. }

3、运行

写完这些代码这个例子既可以跑起来了。从例子也可以看出来,RecyclerView的用法并不比ListView复杂,反而更灵活好用,它将数据、排列方式、数据的展示方式都分割开来,因此可定制型,自定义的形式也非常多,非常灵活。

横向布局

如果想要一个横向的List只要设置LinearLayoutManager如下就行,注意要声明mLayoutManager的类型是LinearLayoutManager而不是父类LayoutManager:

  1. mLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);

Grid布局

如果想要一个Grid布局的列表,只要声明LayoutManager为GridLayoutManager即可:

  1. mLayoutManager = new GridLayoutManager(context,columNum);
  2. mRecyclerView.setLayoutManager(mLayoutManager);

注意,在Grid布局中也可以设置列表的Orientation属性,来实现横向和纵向的Grid布局。

瀑布流布局

瀑布流就使用StaggeredGridLayoutManager吧,具体方法与上面类似,就不做介绍啦。

总结

本节介绍的是一个最最简单的RecyclerView的使用方法,后面将介绍一些更高级的用法。

第二节、RecyclerView的高级方法

当使用了一段时间的RecyclerView,发现为其每一项添加点击事件并没有ListView那么轻松,像ListView直接加个OnItemClickListener就行了。实际上我们不要把RecyclerView当做ListView的一个升级版,希望大家把他看做一个容器,同时里面包含了很多不同的Item,它们可以以不同方式排列组合,非常灵活,点击方式你可以按照你自己的意愿进行实现。

本节主要讲解如何为RecyclerView添加点击事件, 并简单介绍如何进行Item增加删除。

添加点击事件

上一节中我们讲了如何使用RecyclerView的Adpater,其实我们会发现,Adapter是添加点击事件一个很好的地方,里面是构造布局等View的主要场所,也是数据和布局进行绑定的地方。首先我们在Adapter中创建一个实现点击接口,其中view是点击的Item,data是我们的数据,因为我们想知道我点击的区域部分的数据是什么,以便我下一步进行操作:

  1. public static interface OnRecyclerViewItemClickListener {
  2. void onItemClick(View view , DataModel data);
  3. }

定义完接口,添加接口和设置Adapter接口的方法:

  1. private OnRecyclerViewItemClickListener mOnItemClickListener = null;
  2. public void setOnItemClickListener(OnRecyclerViewItemClickListener listener) {
  3. this.mOnItemClickListener = listener;
  4. }

那么这个接口用在什么地方呢?如下代码所示,我们为Adapter实现OnClickListener方法:

  1. public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> implements View.OnClickListener{
  2. @Override
  3. public ViewHolder onCreateViewHolder(ViewGroup viewGroup, final int i) {
  4. View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item, viewGroup, false);
  5. ViewHolder vh = new ViewHolder(view);
  6. //将创建的View注册点击事件
  7. view.setOnClickListener(this);
  8. return vh;
  9. }
  10. @Override
  11. public void onBindViewHolder(ViewHolder viewHolder, final int i) {
  12. viewHolder.mTextView.setText(datas.get(i).title);
  13. //将数据保存在itemView的Tag中,以便点击时进行获取
  14. viewHolder.itemView.setTag(datas.get(i));
  15. }
  16. ...
  17. @Override
  18. public void onClick(View v) {
  19. if (mOnItemClickListener != null) {
  20. //注意这里使用getTag方法获取数据
  21. mOnItemClickListener.onItemClick(v,(DataModel)v.getTag());
  22. }
  23. }
  24. ...
  25. }

做完这些事情,我们就可以在Activity或其他地方为RecyclerView添加项目点击事件了,如在MainActivity中:

  1. mAdapter = new MyAdapter(getDummyDatas());
  2. mRecyclerView.setAdapter(mAdapter);
  3. mAdapter.setOnItemClickListener(new MyAdapter.OnRecyclerViewItemClickListener() {
  4. @Override
  5. public void onItemClick(View view, DataModel data) {
  6. //DO your fucking bussiness here!
  7. }
  8. });

完成了以上代码就可以为RecyclerView添加项目点击事件了,下面我们来看看RecyclerView如何添加和删除数据并在界面上显示。

添加删除数据

以前在ListView当中,我们只要修改后数据用Adapter的notifyDatasetChange一下就可以更新界面。然而在RecyclerView中还有一些更高级的用法:

添加数据:

  1. public void addItem(DataModel content, int position) {
  2. datas.add(position, content);
  3. notifyItemInserted(position); //Attention!
  4. }

删除数据:

  1. public void removeItem(DataModel model) {
  2. int position = datas.indexOf(model);
  3. datas.remove(position);
  4. notifyItemRemoved(position);//Attention!
  5. }

值得注意的是RecyclerView的添加删除都是有默认的动画效果的,如果没有效果可以添加如下代码:

  1. mRecyclerView.setItemAnimator(newDefaultItemAnimator());

当然啦你也可以自己定义你自己的Animator,等我研究明白了也来讲一讲如何自定义这些效果~

RecyclerView使用介绍的更多相关文章

  1. RecyclerView的介绍与使用

    一.什么是RecyclerView 新的视图控件,是Android-support-v7-21版本中新增的一个Widgets,官方对于它的介绍则是:RecyclerView是ListView的升级版本 ...

  2. Android5.0新控件RecyclerVIew的介绍和兼容使用的方法

    第一部分 RecyclerVIew是一个可以替代listview和Gallery的有效空间而且在support-v7中有了低版本支持,具体使用方式还是规规矩矩的适配器加控件模式.我们先来看看官网的介绍 ...

  3. android新组件RecyclerView使用介绍和进阶使用,替用Gallery

    简介: RecyclerView是support-v7包中的新组件,是一个强大的滑动组件,与经典的ListView相比,同样拥有item回收复用的功能,但是直接把viewholder的实现封装起来,用 ...

  4. 【转】android新组件RecyclerView使用介绍和进阶使用,替用Gallery

    简介: RecyclerView是support-v7包中的新组件,是一个强大的滑动组件,与经典的ListView相比,同样拥有item回收复用的功能,但是直接把viewholder的实现封装起来,用 ...

  5. RecyclerView 的介绍以及多布局的实例

    RecyclerView 的使用以及多布局的实例 RecyclerView 是在Android5.0之后推出的,是一个比ListView更加灵活更加高效的适配器类型控件.但是RecyclerView不 ...

  6. Android开发学习之路-RecyclerView滑动删除和拖动排序

    Android开发学习之路-RecyclerView使用初探 Android开发学习之路-RecyclerView的Item自定义动画及DefaultItemAnimator源码分析 Android开 ...

  7. Android RecyclerView完全解析

    RecyclerView完全解析 (一) 前言 话说RecyclerView已经面市很久,也在很多应用中得到广泛的使用,在整个开发者圈子里面也拥有很不错的口碑,那说明RecyclerView拥有比Li ...

  8. 开源框架 ImageLoader +ListView+GridView+RecyclerView 浅解

    下载地址 链接:https://pan.baidu.com/s/1ebz99pcuvHg2bODgeOtSbg 提取码:ia39 一.导入jar包或者添加依赖 jar包地址 导入jar包:将下载的ja ...

  9. RecyclerView源码分析(一)--整体设计

    RecyclerView这个控件出来已经有一段时间了,如果看这篇文章的你,还没有使用过这个控件.那请先去学习怎样使用.不然看也白看.这里奉上一些关于介绍RecyclerView使用方法的优秀博客: 鸿 ...

随机推荐

  1. Day3-C-Radar Installation POJ1328

    Assume the coasting is an infinite straight line. Land is in one side of coasting, sea in the other. ...

  2. 总结了一下 Vue.nextTick() 的原理和用途

    对于 Vue.nextTick 方法,自己有些疑惑.在查询了各种资料后,总结了一下其原理和用途,如有错误,请不吝赐教. 概览 官方文档说明: 用法: 在下次 DOM 更新循环结束之后执行延迟回调.在修 ...

  3. C# 篇基础知识5——委托和事件

    事件处理程序是基于“委托”机制运行的. 1.委托 (1)委托的定义和使用 有时需要将一个函数作为另一个函数的参数,这时就要用到委托(Delegate)机制.例如设计一个马戏表演函数: //定义委托 d ...

  4. StringGrid换行功能

    关闭stringgrid的defaultdrawing功能 StringGrid1.Cells[cCol,cRow] := '测试1'+#13#10+'测试2'; procedure TForm1.S ...

  5. 1_01_MSSQL课程_基础入门2

    1.数据库的迁移方案 ->分离 附加 ->权限问题: ->启用Administrator账号 ->把数据库文件放到默认的数据库文件存放目录. ->数据库文件兼容级别,设置 ...

  6. Emergency

    题意:有N个点,M条边,每个点有权值,问从起点到终点最短路的个数以及权值最大的最短路的权值. 分析:修改Dijstra模板. #include<bits/stdc++.h> using n ...

  7. Eclipse 不能调试的问题

    现象 弹出 Cannot connect to VM Console 中的输出是: ERROR: transport error 202: connect failed: Connection ref ...

  8. 项目上线后,遇到IE浏览器不显示大部分组件的问题

    document.addEventListener('touchmove',(evt)=>{ }) 以上是ES6 语法,箭头函数,当然在IE下是不行的啦. 所以改为:ES5语法 document ...

  9. Ubuntu18.04 LTS 搭建Cassandra集群

    环境需求 jdk8 root@node01:~# java -version java version "1.8.0_202" Java(TM) SE Runtime Enviro ...

  10. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 字体图标(Glyphicons):glyphicon glyphicon-music

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...