RecyclerView 是Android 新添加的一个用来取代ListView的控件,它的灵活性与可替代性比listview更好。

看一下继承关系:

ava.lang.Object
   ↳ android.view.View
     ↳ android.view.ViewGroup
       ↳ android.support.v7.widget.RecyclerView
Known Direct Subclasses

HorizontalGridView,VerticalGridView

介绍

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

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

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

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

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

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

学习原因:

那么有了ListView、GridView为什么还需要RecyclerView这样的控件呢?整体上看RecyclerView架构,提供了一种插拔式的体验,高度的解耦,异常的灵活,通过设置它提供的不同LayoutManager,ItemDecoration , ItemAnimator实现令人瞠目的效果。

  • 你想要控制其显示的方式,请通过布局管理器LayoutManager
  • 你想要控制Item间的间隔(可绘制),请通过ItemDecoration
  • 你想要控制Item增删的动画,请通过ItemAnimator
  • 你想要控制点击、长按事件,需要自己实现

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

  • LinearLayoutManager

  • GridLayoutManager

  • StaggeredGridLayoutManager

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

本节所示示例是一个最简单的使用方法,作者用的环境是Android Studio 1.5。

1、添加依赖

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

compile 'com.android.support:recyclerview-v7:23.1.1'

注意:版本需要和其它保持一致,如其它是 23.3,这里也需要改成23.3;

2、编写代码

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

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"

    tools:context="com.jcdh.jcli.recyclerview.MainActivity">
    <android.support.v7.widget.RecyclerView
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:scrollbars="vertical"
        android:id="@+id/recyclerView"
        android:layout_marginTop="60dp"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"></android.support.v7.widget.RecyclerView>

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Add Item"
        android:id="@+id/button"
        android:onClick="addRecyclerItem"
        android:layout_alignParentTop="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true" />

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/editText"
        android:textSize="20sp"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_toLeftOf="@+id/button"
        android:layout_toStartOf="@+id/button" />
</RelativeLayout>

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

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

getData():

private List<String>getDummyDatas()
{List<String> array = new ArrayList<>();for(int i = 0;i<110;i++){array.add("我是"+i);}return array;}

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

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder>  {public List<String> datas = null;public MyAdapter(List<String> datas) {this.datas = datas;}//创建新View,被LayoutManager所调用@Overridepublic ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item,viewGroup,false);ViewHolder vh = new ViewHolder(view);return vh;}//将数据与界面进行绑定的操作@Overridepublic void onBindViewHolder(ViewHolder viewHolder, int position) {final  int index = position;viewHolder.mTextView.setText(datas.get(position));}//获取数据的数量@Overridepublic int getItemCount() {return datas.size();}//自定义的ViewHolder,持有每个Item的的所有界面元素public static class ViewHolder extends RecyclerView.ViewHolder {public TextView mTextView;public ViewHolder(View view){super(view);mTextView = (TextView) view.findViewById(R.id.textView);}}}

3、运行

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

横向布局

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

mLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);

   

Grid布局

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

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

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

瀑布流布局

        int span = 3;mLayoutManager = new StaggeredGridLayoutManager(span, StaggeredGridLayoutManager.VERTICAL);mRecyclerView.setLayoutManager(mLayoutManager);


上面介绍的是一个最最简单的RecyclerView的使用方法,下面将介绍一些更高级的用法

第二节、RecyclerView的高级方法

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

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

添加点击事件

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

    public static interface OnRecyclerViewItemClickListener {void onItemClick(View view , <code class="js plain">DataModel</code> data, int position);}

注:DataModel,这个是一个Objcet ,可能是一个类,也可能是一个String;
定义完接口,添加接口和设置Adapter接口的方法:

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

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

    @Overridepublic void onBindViewHolder(ViewHolder viewHolder, int position) {final  int index = position;viewHolder.mTextView.setText(datas.get(position));//将数据保存在itemView的Tag中,以便点击时进行获取//将创建的View注册点击事件viewHolder.itemView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if (mOnItemClickListener != null) {//注意这里使用getTag方法获取数据mOnItemClickListener.onItemClick(v, (String) datas.get(index), index);}}});}

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

    mAdapter.setOnItemClickListener(new MyAdapter.OnRecyclerViewItemClickListener() {@Overridepublic void onItemClick(View view, String data,int position) {}});

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

添加删除数据

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

添加数据:

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

删除数据:

    public void removeItem(int index) {datas.remove(index);notifyItemRemoved(index);//Attention!}

值得注意的是RecyclerView的添加删除都是有默认的动画效果的,如果没有效果可以添加如下代码:
mRecyclerView.setItemAnimator(newDefaultItemAnimator());
当然啦你也可以自己定义你自己的Animator,等我研究明白了也来讲一讲如何自定义这些效果~

Demo 下载 http://download.csdn.net/detail/q610098308/9326767

转载于:https://www.cnblogs.com/sharecenter/p/5621021.html

Android 高级编程 RecyclerView 控件的使用相关推荐

  1. Android高级图片滚动控件,编写3D版的图片轮播器

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/17482089 大家好,好久不见了,最近由于工作特别繁忙,已经有一个多月的时间没写博 ...

  2. Android 高级编程【6个实战案例(附源码):刮刮卡、补间动画、逐帧动画、Fragment、RecyclerView、下拉刷新】

    目   录 刮刮卡案例[ScratchCard] 结构图 activity_main.xml MainActivity.java 运行效果图 补间动画(Tween Animation) 逐帧动画(Fr ...

  3. listview控件在php的使用方法,Android_Android编程之控件ListView使用方法,本文实例讲述了Android编程之控 - phpStudy...

    Android编程之控件ListView使用方法 本文实例讲述了Android编程之控件ListView使用方法.分享给大家供大家参考.具体分析如下: 控件ListView是一个重要的控件,可以被用作 ...

  4. Android初学二之仿微信APP实现RecyclerView控件的设计开发,实现点击事件及图片瀑布流

    目录 0 实验环境 1 界面展示 2 功能说明 3 核心代码 3.1 实现RecyclerView控件的设计开发 3.2 添加了文字库assets 3.3 实现点击事件对item中的每个LinearL ...

  5. Android 宫格图控件MultiImageView(RecyclerView适配器中展示不定数量的图片)

    Android 宫格图控件MultiImageView(RecyclerView适配器中展示不定数量的图片) 最近的github上的996ICU在IT界应该很多人听说了,不知道CSDN上什么是最受大家 ...

  6. 视频教程-Android Material Design 新控件-Android

    Android Material Design 新控件 刘志远,北京邮电大学硕士研究生, 北京育华志远科技有限公司创始人, 育华志远教育品牌负责人,育华志远课程体系打造者. 率领团队为互联网行业培训千 ...

  7. Android常用酷炫控件(开源项目)github地址汇总

    转载一个很牛逼的控件收集帖... 第一部分 个性化控件(View) 主要介绍那些不错个性化的 View,包括 ListView.ActionBar.Menu.ViewPager.Gallery.Gri ...

  8. RecyclerView控件实现横向滚动和瀑布流布局,以及RecyclerView的点击监听(项目已上传GitHub)

    先附上我的GitHub项目地址: https://github.com/Skymqq/RecyclerViewTest.git 我们已经知道,ListView的拓展性不好,它只能实现纵向的滚动的效果, ...

  9. RecyclerView控件的基本使用(增强版的ListView)

    ListView由于其强大的功能,在过去的Android开发当中可以说是贡献卓越,直到今天仍然还有不计其数的程序在继续使用着ListView.不过ListView并不是完全没有缺点的,比如说如果我们不 ...

最新文章

  1. 30个Python常用极简代码
  2. Linux免设置路由端口映射,2014/04/01 演示中设置linux路由器、端口过滤的使用、路由设置...
  3. 数据分析师必须会python_数据分析师必须掌握的9种数据分析方法
  4. python 三分类的哑编码_python数据挖掘实战 -数据预处理篇(数据可视化-空值填充-哑变量编码)...
  5. 最吓人的鬼故事排行榜前十名(转载)
  6. 《诗经》诗无邪 —— 雅篇
  7. python爬虫菜鸟教程-python爬虫项目(新手教程)之知乎(requests方式)
  8. C#做小工具的时候碰到的问题
  9. Postman调接口时获取Chrome浏览器Cookie数据携带发送
  10. 怎样搜索计算机中docx格式的文件,如何打开docx文件 打开docx文件方法
  11. [转]寂寞的数学家和不孤独的素数
  12. Excel多条件计数——COUNTIFS【获奖情况统计】
  13. 在nuxt中使用swiper轮播
  14. 商品库存盘点 门店和仓库 需要盘点的物品都可以使用 多种方式设备可以盘点商品库存 移动智能终端盘点机盘点
  15. Android HIDL 介绍学习之客户端调用
  16. 关于Java中大小写转换
  17. linux 启动openfire
  18. Json代码实战演练
  19. Arduino物联网开发实例教程
  20. why哥这里有一道Dubbo高频面试题,请查收。

热门文章

  1. [原创软件]体验组批量加分工具
  2. SDWebImage的使用说明
  3. 上周热点回顾(7.9-7.15)
  4. spring 概念理解(资料)
  5. java护照号码校验_学无止境之小白学java……第001天
  6. Linux系统更新最新版R语言方法
  7. ajax servlet增删改查,Servlet ajax 文件上传和JDBC+Servler用户表增删改查
  8. excel连接mysql 数据库
  9. linux 磁盘挂载sde,linux lvm挂载新的硬盘并且扩容
  10. down.php无法打开,php下载文件 图片不能打开,该怎么解决