Android RecyclerView 是Android5.0推出来的,导入support-v7包即可使用。

个人体验来说,RecyclerView绝对是一款功能强大的控件。

首先总结下RecyclerView的特点:

1.支持不同方向,不同排版模式,实现多种展现数据的形式,涵盖了ListView,GridView,瀑布流等数据表现的形式

2.内部实现了回收机制,无需我们考虑View的复用情况

3.取消了onItemClick等点击事件,需要自己手动去写

------------------------------------------------------------------------------------

那么让我们通过一些Demo来了解RecyclerView的基本使用

android studio

build.gradle文件中 dependencies中添加

  1. compile 'com.android.support:recyclerview-v7:22.+'

首先,要导入support-v7 包

  1. import android.support.v7.widget.RecyclerView;

RecyclerView和ListView的使用一样,都需要有对应的Adapter,列表项布局,数据源

1.先写主Activity布局

可以看到RecyclerView的标签

  1. <android.support.v7.widget.RecyclerView>
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.com/apk/res-auto"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:orientation="vertical"
  6. tools:context="com.xqx.superapp.app.Android5Activity">
  7.  
  8. <Button
  9. android:text="添加一个数据"
  10. android:layout_width="wrap_content"
  11. android:layout_height="wrap_content"
  12. android:onClick="btnAddItem"
  13. />
  14. <Button
  15. android:text="删除第一个"
  16. android:onClick="btnRemoveItem"
  17. android:layout_width="wrap_content"
  18. android:layout_height="wrap_content"/>
  19.  
  20. <android.support.v7.widget.RecyclerView
  21. android:id="@+id/recycle_view"
  22. android:layout_width="match_parent"
  23. android:layout_height="match_parent"
  24. >
  25. </android.support.v7.widget.RecyclerView>
  26.  
  27. </LinearLayout>

菜单项布局,标准的上面图片,下面文字

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical"
  4. android:gravity="center"
  5. android:layout_width="match_parent"
  6. android:layout_height="match_parent">
  7. <ImageView
  8. android:id="@+id/item_icon"
  9. android:src="@mipmap/machao_moqi"
  10. android:layout_width="wrap_content"
  11. android:layout_height="wrap_content"/>
  12. <TextView
  13. android:id="@+id/item_title"
  14. android:text="名称"
  15. android:layout_width="wrap_content"
  16. android:layout_height="wrap_content"
  17. />
  18. </LinearLayout>

2.接下来就看Activity代码了

首先看成员变量,与ListView,GridView一样 标准三样, 控件,数据源,适配器

  1. private List<String> data;
  2. private RecyclerView recyclerView;
  3. private MyRecycleAdapter adapter; //自定义适配器,继承RecyclerView.Adapter

接着我们必须要自定义一个ViewHolder,这个ViewHolder 必须要继承 RecyclerView.ViewHolder

注意RecyclerView不再提供onItemClick事件监听,所以需要我们自己手工写监听事件的方法

  1. private static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
  2. public ImageView imageView;
  3. public TextView textView;
  4.  
  5. public ViewHolder(View itemView) {
  6. super(itemView);
  7. // 通常ViewHolder的构造,就是用于获取控件视图的
  8. imageView = (ImageView) itemView.findViewById(R.id.item_icon);
  9. textView = (TextView) itemView.findViewById(R.id.item_title);
  10. // TODO 后续处理点击事件的操作
  11. itemView.setOnClickListener(this);
  12.  
  13. }
  14. @Override
  15. public void onClick(View v) {
  16. int position = getAdapterPosition();
  17. Context context = imageView.getContext();
  18. Toast.makeText(context,"显示第"+position+"个项",Toast.LENGTH_SHORT).show();
  19. }
  20. }

再让我们看自定义适配器,注意这里的参数是ViewHolder,这个ViewHodler是我们自己的,不要导入v7包下的ViewHolder,

之后要重写三个方法

  1. private class MyRecycleAdapter extends RecyclerView.Adapter<ViewHolder>{
      
  1. @Override
    public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
    return null;
    }
  2.  
  3. @Override
    public void onBindViewHolder(ViewHolder viewHolder, int i) {
  4.  
  5. }
  6.  
  7. @Override
    public int getItemCount() {
    return 0;
    }
  1. }

在自定义适配器MyRecycleAdapter中,首先要写一个构造方法,因为有数据源,所有构造方法里必然有List

  1. private List<String> strings;
  2. public MyRecycleAdapter(List<String> strings) {
  3. this.strings = strings;
  4. }

然后就要重写三个方法了,

  1. @Override
  2. public int getItemCount() {
  3. int ret = ;
  4. if (strings != null) {
  5. ret = strings.size();
  6. }
  7. return ret;
  8. }
  9.  
  10. @Override
  11. public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
  12. ViewHolder ret = null;
  13. // 不需要检查是否复用,因为只要进入此方法,必然没有复用
  14. // 因为RecyclerView 通过Holder检查复用
  15. View v = LayoutInflater.from(Android5Activity.this).inflate(R.layout.item_recycler, viewGroup, false);
  16. ret = new ViewHolder(v);
  17. return ret;
  18. }
  19.  
  20. @Override
  21. public void onBindViewHolder(ViewHolder viewHolder, int i) {
  22. // 1.这里进行图片的加载
  23. viewHolder.textView.setText(strings.get(i));
  24. int resId = R.mipmap.ic_launcher;
  25. int index = i%;
  26. switch (index){
  27. case :
  28. resId = R.mipmap.a11;
  29. break;
  30. case :
  31. resId = R.mipmap.a33;
  32. break;
  33. case :
  34. resId = R.mipmap.a22;
  35. break;
  36. }
  37. viewHolder.imageView.setImageResource(resId);
  38. }

---------------------------------------------------------------------------------------------------------------

完成自定义适配器和自定义ViewHolder的代码 就要进行RecyclerView的使用了

首先 要了解  RecyclerView.LayoutManager 这个属性

用于进行一个布局的设置,可以设置显示模式,ListView或者GridView或者瀑布流

1.ListView显示模式

  1. // 1.线性布局
  2. LinearLayoutManager layoutManager =
  3. new LinearLayoutManager(this, // 上下文
  4. LinearLayout.VERTICAL, //垂直布局,
  5. false);

                                    

2.GridView显示模式

  1. // 2.Grid布局
  2. RecyclerView.LayoutManager layoutManager =
  3. new GridLayoutManager(this,
  4. , // 每行显示item项数目
  5. GridLayoutManager.HORIZONTAL, //水平排列
  6. false
  7. );

                                    

3.瀑布流显示模式

  1. // 3.瀑布流
  2. RecyclerView.LayoutManager layoutManager =
  3. new StaggeredGridLayoutManager(, // 每行显示的item项数目
  4. StaggeredGridLayoutManager.VERTICAL); // 垂直排列

以上三种显示模式任意设置一种 就可以继续下面的代码

  1. recyclerView.setLayoutManager(layoutManager);
  2. // 设置 RecyclerView的Adapter
  3. // 注意一定在设置了布局管理器之后调用
  4. adapter = new MyRecycleAdapter(data);
  5. recyclerView.setAdapter(adapter);

最后记得加上“添加一个数据”,“删除第一个数据”的按钮响应事件。

首先看一下以往我们对listview,gridview等等的删除某一项的操作

先在数据源中删除该位置的数据,然后刷新整个适配器,那么就可能会造成列表闪屏的问题,还有为了删除添加一个数据项而操作整个数据源的问题

  1. public void btnAddItem(View view) {
  2. data.add(,"Time:"+System.currentTimeMillis());
  3. adapter.notifyDataSetChanged();
  4. }
  1. public void btnRemoveItem(View view) {
  2. if (!data.isEmpty()) {
  3. data.remove();
  4. }
  5. adapter.notifyItemRemoved();
  6. }

而RecyclerView为我们提供了一些新的实用的方法:

  1. public void add(ViewModel item, int position) {
  2. items.add(position, item); //数据源先添加该数据
  3. notifyItemInserted(position); //在某个位置刷新即可
  4. }
  5.  
  6. public void remove(ViewModel item) {
  7. int position = items.indexOf(item);
  8. items.remove(position); //数据源先删除该数据
  9. notifyItemRemoved(position); //在某个位置删除即可
  10. }

完整代码:

  1. package com.xqx.superapp.app;
  2.  
  3. import android.app.Activity;
  4. import android.content.Context;
  5. import android.support.v7.app.ActionBarActivity;
  6. import android.os.Bundle;
  7. import android.support.v7.widget.GridLayoutManager;
  8. import android.support.v7.widget.LinearLayoutManager;
  9. import android.support.v7.widget.RecyclerView;
  10. import android.support.v7.widget.StaggeredGridLayoutManager;
  11. import android.util.Log;
  12. import android.view.*;
  13. import android.widget.*;
  14.  
  15. import java.util.LinkedList;
  16. import java.util.List;
  17.  
  18. public class Android5Activity extends Activity {
  19.  
  20. private List<String> data;
  21. private RecyclerView recyclerView;
  22. private MyRecycleAdapter adapter;
  23.  
  24. @Override
  25. protected void onCreate(Bundle savedInstanceState) {
  26. super.onCreate(savedInstanceState);
  27. setContentView(R.layout.activity_android5);
  28. data = new LinkedList<String>();
  29. recyclerView = (RecyclerView) findViewById(R.id.recycle_view);
  30. // 设置布局管理器
  31. // 支持 单列线性排列,支持GridView模式,瀑布流模式
  32. // 1.线性布局
  33. LinearLayoutManager layoutManager =
  34. new LinearLayoutManager(this, // 上下文
  35. LinearLayout.VERTICAL, //垂直布局,
  36. false);
  37.  
  38. // // 2.Grid布局
  39. // RecyclerView.LayoutManager layoutManager =
  40. // new GridLayoutManager(this,
  41. // 2,
  42. // GridLayoutManager.HORIZONTAL,
  43. // false
  44. // );
  45. //
  46. // // 3.瀑布流
  47. // RecyclerView.LayoutManager layoutManager =
  48. // new StaggeredGridLayoutManager(3,
  49. // StaggeredGridLayoutManager.VERTICAL);
  50. recyclerView.setLayoutManager(layoutManager);
  51. // 设置 RecyclerView的Adapter
  52. // 注意一定在设置了布局管理器之后调用
  53. adapter = new MyRecycleAdapter(data);
  54. recyclerView.setAdapter(adapter);
  55. }
  56.  
  57. public void btnAddItem(View view) {
  58. data.add(,"Time:"+System.currentTimeMillis());
  59. adapter.notifyDataSetChanged();
  60. }
  61.  
  62. public void btnRemoveItem(View view) {
  63. if (!data.isEmpty()) {
  64. data.remove();
  65. }
  66. adapter.notifyItemRemoved();
  67. }
  68.  
  69. /**
  70. * 继承RecyclerView.Adapter,用于显示数据
  71. * 需要定义并且使用 ViewHolder ,必须要使用
  72. */
  73. private class MyRecycleAdapter extends RecyclerView.Adapter<ViewHolder>{
  74. private List<String> strings;
  75. public MyRecycleAdapter(List<String> strings) {
  76. this.strings = strings;
  77. }
  78.  
  79. @Override
  80. public int getItemCount() {
  81. int ret = ;
  82. if (strings != null) {
  83. ret = strings.size();
  84. }
  85. return ret;
  86. }
  87.  
  88. @Override
  89. public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
  90. ViewHolder ret = null;
  91. // 不需要检查是否复用,因为只要进入此方法,必然没有复用
  92. // 因为RecyclerView 通过Holder检查复用
  93. View v = LayoutInflater.from(Android5Activity.this).inflate(R.layout.item_recycler, viewGroup, false);
  94. ret = new ViewHolder(v);
  95. return ret;
  96. }
  97.  
  98. @Override
  99. public void onBindViewHolder(ViewHolder viewHolder, int i) {
  100. viewHolder.textView.setText(strings.get(i));
  101. int resId = R.mipmap.ic_launcher;
  102. int index = i%;
  103. switch (index){
  104. case :
  105. resId = R.mipmap.a11;
  106. break;
  107. case :
  108. resId = R.mipmap.a33;
  109. break;
  110. case :
  111. resId = R.mipmap.a22;
  112. break;
  113. }
  114. viewHolder.imageView.setImageResource(resId);
  115. }
  116. }
  117.  
  118. /**
  119. * 创建自己的ViewHolder ,必须要继承RecyclerView.ViewHolder
  120. */
  121. private static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
  122. public ImageView imageView;
  123. public TextView textView;
  124.  
  125. public ViewHolder(View itemView) {
  126. super(itemView);
  127. // 通常ViewHolder的构造,就是用于获取控件视图的
  128. imageView = (ImageView) itemView.findViewById(R.id.item_icon);
  129. textView = (TextView) itemView.findViewById(R.id.item_title);
  130. // TODO 后续处理点击事件的操作
  131. itemView.setOnClickListener(this);
  132.  
  133. }
  134. @Override
  135. public void onClick(View v) {
  136. int position = getAdapterPosition();
  137. Context context = imageView.getContext();
  138. Toast.makeText(context,"显示第"+position+"个项",Toast.LENGTH_SHORT).show();
  139. }
  140. }
  141. }

-------------------------------------------------------------------------------------------------------------

其他相关:

浅谈FloatingActionButton(悬浮按钮)

浅谈DrawerLayout(抽屉效果)

浅谈TabLayout(ViewPager+Tab联动)

浅谈GridLayout(网格布局)

浅谈RecyclerView(完美替代ListView,GridView)的更多相关文章

  1. Android最新组件RecyclerView,替代ListView

    转载请注明出处:http://blog.csdn.net/allen315410/article/details/40379159 万众瞩目的android最新5.0版本号不久前已经正式公布了,对于我 ...

  2. RecyclerView(替代ListView)使用方法介绍

    在build.gradle文件加入以下代码 compile 'com.android.support:cardview-v7:21.0.3' compile 'com.android.support: ...

  3. (浅谈).Net控件GridView绑定数据

    前台GridView属性设置 <td> <asp:GridView ID="GridView" runat="server" AutoGene ...

  4. 浅谈DevExpress<三>:在GridView中加载动态图片

    今天的演示效果如下:在GridView中的下拉框中选中一种颜色,则后面的加载相应的图片,如下图: 1.

  5. 浅谈Android编码规范及命名规范

    前言: 目前工作负责两个医疗APP项目的开发,同时使用LeanCloud进行云端配合开发,完全单挑. 现大框架已经完成,正在进行细节模块上的开发 抽空总结一下Android项目的开发规范:1.编码规范 ...

  6. 浅谈FloatingActionButton(悬浮按钮)

    一.介绍 这个类是继承自ImageView的,所以对于这个控件我们可以使用ImageView的所有属性 android.support.design.widget.FloatingActionButt ...

  7. 浅谈TabLayout(ViewPager+Tab联动)

    google发布了的Android Support Design库中提供了TabLayout 通过TabLayout+ViewPager实现导航栏效果,点击Tab ,ViewPager跟随变化,滑动V ...

  8. [Android]使用RecyclerView替代ListView(三)

    以下内容为原创,转载请注明: 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/4268097.html  这次来使用RecyclerView实现Pinn ...

  9. [Android]使用RecyclerView替代ListView(二)

    以下内容为原创,转载请注明: 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/4242541.html 以前写过一篇“[Android]使用Adapte ...

随机推荐

  1. 深入理解javascript对象系列第二篇——属性操作

    × 目录 [1]查询 [2]设置 [3]删除[4]继承 前面的话 对于对象来说,属性操作是绕不开的话题.类似于“增删改查”的基本操作,属性操作分为属性查询.属性设置.属性删除,还包括属性继承.本文是对 ...

  2. QuickContactBadge去掉三角

    我们首先来分析一下QuickContactBadge源码 在QuickContactBadge构造函数中会给mOverlay赋值 private Drawable mOverlay; public Q ...

  3. javascript模拟继承

    javascript作为前端开发的标配技能,如果不掌握好它的三大特点:1.原型 2.作用域 3. 闭包 ,又怎么可以说你学好了这门语言呢?如果标配的技能都没有撑握好,怎么可以任性的玩耍呢?怎么验证自己 ...

  4. 高级javascript---严格模式

    严格模式 (JavaScript)   严格模式是一种将更好的错误检查引入代码中的方法. 在使用严格模式时,你无法使用隐式声明的变量.将值赋给只读属性或将属性添加到不可扩展的对象等. 本主题后面的代码 ...

  5. 如何利用Oracle外部表导入文本文件的数据

    同事最近在忙数据一致性比对工作,需要对不同文本文件中的数据进行比对,有的文件较大,记录较多,如果用普通的文本编辑器打开的话,很显然,会很卡,甚至打不开. 基于此,可将该文本文件的数据导入到数据库中,在 ...

  6. sysv-rc-conf管理Ubuntu server开机启动服务

    在RedHat中,都是使用chkconfig来管理服务的,但是在Ubuntu Server中,却有一个更好的工具,chkconfig也是可以使用的.今天来说一下sysv-rc-conf sysv-rc ...

  7. 【jQuery小实例】---3 凤凰网首页图片动态效果

    ---本系列文章所用使用js均可在本博客文件中找到 本页面实现类似于凤凰网首页,鼠标点击新闻,可以在div中显示新闻图片,点击军事显示军事图片的效果.采用的思路是:鼠标悬浮,显示当前div中的内容(图 ...

  8. 魔方渗透系统安装VMtools教程

    虚拟机魔方渗透系统安装VMtools教程 1.开机登陆后,如图点击安装VMtools. 2.进入media文件夹: cd /media   查看mdia文件夹内容: ls   3.打开VMware T ...

  9. mysql转换类型

    今天遇到一个问题,那就是当时一个项目设计表的时候,把时间以20160101123596这样的形式,以varchar存到了数据库里. 今天要写一条sql,查询一个报表,条件就是要过滤这个时间,但是var ...

  10. 使用CodeDom动态生成类型

    .NET 3.5的时候加入了匿名类型这个特性,我们可以直接使用 new {name="abc"} 来直接生成一个对象.这个特性现在应用的地方很多,比如dapper的查询参数都是用匿 ...