前言

目前的项目中,基本已经使用 RecyclerView 全面替换了ListView和GridView。确实,使用RecyclerView更加灵活,功能也更加强大。

最近也尝试把学习到的知识点花时间整理归纳,作为对自己学习的总结,也可以在复习的过程中查漏补缺,完善自己的知识网络。借此将RecyclerView作为总结系列的开头,希望自己能够坚持下去。

本章节内容如下:(星号代表额外补充内容)

1.RecyclerView简介和使用准备

2.RecyclerView的入门使用

3*.简单好用的小控件:CardView

4.通过RecyclerView+CardView的简单使用实现一个小案例:

一.RecyclerView简介和使用准备

关于RecyclerView的简介,谷歌官方文档说明非常简洁:

A flexible view for providing a limited window into a large data set.一种为有限个数的数据集提供有限窗口的灵活的View

对于Android应用而言,ListView和GridView是展示数据集合的选择,但是RecyclerView比前两者更加先进和灵活,
目前越来越多的Android应用都在优先选择RecyclerView代替之前的ListView和GridView。

而使用RecyclerView的好处究竟在哪里呢?我们在接下来的demo中一点一点接触并学习使用它,慢慢感受相对于ListView和GridView,它的简单和灵活性。

RecyclerView使用方式

在AndroidStudio项目app的Gradle文件中添加依赖:

//注意:将25.0.1换成你目录下v7包一样的版本号
compile 'com.android.support:recyclerview-v7:25.0.1'

需要注意的一点是,我们可以看到,RecyclerView是V7包下的控件,因此我们需要将RecyclerViewd的版本和V7包的版本一致,否则编译会不通过。

添加完依赖并同步之后,我们就可以直接使用RecyclerView了。

二.RecyclerView的入门使用

1.xml文件中配置

添加依赖成功后,我们在项目中的activity_main.xml中直接就可以添加RecycleView控件了:

 <?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:id="@+id/activity_main"android:layout_width="match_parent"android:layout_height="match_parent"tools:context="com.mei_husky.samplerv.MainActivity"><android.support.v7.widget.RecyclerViewandroid:id="@+id/recycleView"android:layout_width="match_parent"android:layout_height="match_parent"></android.support.v7.widget.RecyclerView>

ok,非常简单,这样我就可以在xml对应的MainActivity.java文件中对控件进行处理了。

2.Activity中的使用

在Activity中代码如下:

public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initDatas();initRecyclerView();}//给数据源赋值private void initDatas() {for (int i=0;i<50;i++){datas.add("这是第i条条目,i=="+i);}}private ArrayList<String> datas=new ArrayList<>();/*** 初始化recyclerview*/private void initRecyclerView() {RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycleView); //初始化控件MyRvAdapter adapter= new MyRvAdapter(this,datas);//创建适配器adapterrecyclerView.setAdapter(adapter);       //给控件配置adpter//配置布局LinearLayoutManager manager=new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false);recyclerView.setLayoutManager(manager);}
}

OK,代码非常简单,我们仅仅在Activity中初始化了一个list集合,里面是50条语句,用来展示在RecyclerView的item上面;然后配置RecyclerView就可以了。

和ListView很相似,初始化配置RecyclerView也是创建了一个Adapter适配器,然后将Adapter的实例化对象设置给RecyclerView就可以了。

之后我们要思考的问题是,RecyclerView是可以代替ListView,GridView,甚至可以直接达到瀑布流的效果,那么它是怎么知道我们要它成为哪种布局呢?答案是:

配置LayoutManager

如果我们想要它成为listview一样,我们就给它设置一个LinearLayoutManager:

//切换listView样式,三个参数分别为(上下文对象,垂直还是水平布局,是否倒序排列)
LinearLayoutManager linearLayoutManager=new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false);
recycleView.setLayoutManager(linearLayoutManager);

如果我们要让它是流布局,那么就给它设置一个GridLayoutManager;

//切换gridView样式,三个参数分别为(上下文对象,垂直还是水平布局,是否倒序排列)
GridLayoutManager gridLayoutManager=new GridLayoutManager(ctx,2,GridLayoutManager.VERTICAL,false);
recycleView.setLayoutManager(gridLayoutManager);

如果我们要让它做成瀑布流的效果,那么就给它设置StaggeredGridLayoutManager;

//切换瀑布流样式,2个参数分别为(瀑布流分几列,垂直还是水平布局)
StaggeredGridLayoutManager staggeredGridLayoutManager=new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL);
recycleView.setLayoutManager(staggeredGridLayoutManager);

设置布局参数是非常简单而且有效的,我们甚至可以随意将某种布局通过代码转换为另外一种布局!

假如有这样一种需求:用户通过界面的交互可以任意切换布局样式,如果是传统的listView或者GridView,想要通过代码的逻辑互相转换时非常麻烦的,而我们使用RecycleView,我们就可以这样:

public void onClick(View view) {switch (view.getId()) {case R.id.list://切换listView样式LinearLayoutManager linearLayoutManager=new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false);recycleView.setLayoutManager(linearLayoutManager);break;case R.id.grid://切换gridView样式GridLayoutManager gridLayoutManager=new GridLayoutManager(ctx,2,GridLayoutManager.VERTICAL,false);recycleView.setLayoutManager(gridLayoutManager);break;case R.id.stream://切换瀑布流样式StaggeredGridLayoutManager staggeredGridLayoutManager=new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL);recycleView.setLayoutManager(staggeredGridLayoutManager);break;}
}

咳咳,扯远了,说回来。

看样子我们配置好了,那么我们可以直接运行了吗?显然不行,因为我们还不知道MyAdapter究竟是什么呢,接下来也是RecyclerView入门学习的一个难点,就是适配器的配置。

3.Adapter和ViewHolder

先上Adapter的代码:

public class MyRvAdapter extends RecyclerView.Adapter<MyRvAdapter.MyViewHolder> {private Context ctx;private ArrayList<String> datas;//构造方法public MyRvAdapter(Context ctx, ArrayList<String> datas) {this.ctx = ctx;this.datas = datas;}//创建ViewHolder,并将item的界面和ViewHolder绑定@Overridepublic MyRvAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {return new MyViewHolder(LayoutInflater.from(ctx).inflate(R.layout.item_rv,parent,false));}//将控件和数据绑定@Overridepublic void onBindViewHolder(final MyViewHolder holder, final int position) {holder.tv.setText(datas.get(position));holder.tv.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Toast.makeText(ctx,"第X个item被点了,X="+position,Toast.LENGTH_SHORT).show();}});}//条目的数量@Overridepublic int getItemCount() {return datas.size();}//自定义的ViewHolder,持有每个Item的的所有界面元素class MyViewHolder extends RecyclerView.ViewHolder{public MyViewHolder(View itemView) {super(itemView);tv= (TextView) itemView.findViewById(R.id.tv);}public TextView tv;}
}

如果是第一次接触RecyclerView的同学,我大胆的揣测一下此时的状态应该是这样的:

不过不用担心,因为确实,这个自定义Adapter和我们在使用listview的时候还是有点不太一样的,大多数人第一次接触同样有点晕,等说明了每个方法的作用,再实际操作两回,基本就没什么问题了。

注意:以下的内容很重要!!!

首先这边我们需要继承RecyclerView.Adaper类,然后实现两个重要的方法onBindViewHodler()以及onCreateViewHolder()。

onCreateViewHolder():我们可以理解为这是listView中的convertView,当创建新的item时需要我们引入的布局。我们通过inflate方法将获得的布局作为参数传给ViewHolder的构造器,将findViewById的方法全部交给ViewHolder去处理,这样我们处理任何控件时,只需要操作holder就可以了。

我们的item布局界面(R.layout.item_rv)很简单,我们仅仅展示一条TextView,上面显示信息就可以了:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical" android:layout_width="match_parent"android:layout_height="match_parent"><TextViewandroid:id="@+id/tv"android:layout_width="match_parent"android:layout_height="60dp"android:textSize="16sp"android:layout_margin="10dp"android:textColor="#1e1e1e"android:gravity="center"/></LinearLayout>

onBindViewHodler():这个就很简单了,我们在这里需要处理的仅仅是每条item中的所有界面元素和数据的绑定,在demo中我们将datas中对应的字符串交给holder中的TextView展示即可,当然为了让我们看到绑定的结果,我们设置,textView的点击监听,弹出一条Toast。

getItemCount():也是最好理解的一个方法,通过返回值我们告诉RecyclerView需要展示多少个item。

4.大功告成?

好了,现在万事俱备,我们需要做的仅仅是打开手机收获我们的结果了:

demo展示效果如下:

很好,我们花费了很长时间,终于把效果实现了!撒花!

然而

原因很简单,我们花费大量的时间成本,学习达成的效果显然和我们以往使用的ListView效果一样,那么我们学习它的意义何在?这显然不符合程序员三大美德:懒惰 缺乏耐性 和傲慢 ( laziness,Impatience.and Hubris)

当然是有意义的。不过这需要我们慢慢去了解和感受,因为简单的需求是体现不出来其实用和简单性的,当需求随着时间的堆积而一次次的变得复杂,终究我们会有一天发现,RecyclerView实在太好用了!

三*.简单好用的小控件:CardView

1.配置方式

在AndroidStudio项目app的Gradle文件中添加依赖:

//注意:将25.0.1换成你目录下v7包一样的版本号
compile 'com.android.support:cardview-v7:25.0.1'

和RecyclerView一样,我们需要将CardView的版本和V7包的版本一致,否则编译会不通过。

添加完依赖并同步之后,我们就可以直接使用CardView了。

2.xml配置

xml中使用方式如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:layout_width="match_parent"android:layout_height="wrap_content"><android.support.v7.widget.CardViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:layout_marginLeft="10dp"android:layout_marginRight="10dp"app:cardBackgroundColor="@color/blue"app:cardCornerRadius="16dp"app:cardElevation="16dp"><TextViewandroid:id="@+id/tv"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:layout_margin="10dp"android:gravity="center"android:textSize="20sp" /></android.support.v7.widget.CardView>
</LinearLayout>

很简单,CardView本身就是extends FrameLayout的,使用方式和FrameLayou基本没有区别。

3.基本属性

基本属性如下,最常用的也就是前两个

app:cardBackgroundColor 这是设置背景颜色

app:cardCornerRadius 这是设置圆角大小

app:cardElevation这是设置z轴的阴影

app:cardMaxElevation这是设置z轴的最大高度值

app:cardUseCompatPadding是否使用CompatPadding

app:cardPreventCornerOverlap是否使用PreventCornerOverlap

app:contentPadding 设置内容的padding

app:contentPaddingLeft 设置内容的左padding

app:contentPaddingTop 设置内容的上padding

app:contentPaddingRight 设置内容的右padding

app:contentPaddingBottom 设置内容的底padding

四, 练手小案例

接下来做一个好玩的小案例来巩固RecyclerView的知识,好友印象

[好友印象]

案例效果如下:

界面效果还不错,依靠同样是support v7包中的CardView,顾名思义,就是类似于卡片一样的控件,简约而又美观,实在是开发个人应用时的一大神器。

而卡片的删除效果则是RecyclerView自带的效果,不仅仅是删除的效果,RecyclerView还自带很多其他的动画效果,相比之下确实比GridView好用许多。

【好友印象】源码在此,戳我!

RecyclerView使用探索1--了解及使用相关推荐

  1. RecyclerView 悬浮/粘性头部——StickyHeaderDecoration

    转载至:https://blog.csdn.net/qian520ao/article/details/76167193 ItemDecoration是recyclerView拓展的一个很好工具,支持 ...

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

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

  3. 将替代ListView的RecyclerView 的使用(一)

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/by317966834/article/details/36205923 RecyclerView 是 ...

  4. 一个漂亮而强大的RecyclerView

    代码地址如下: http://www.demodashi.com/demo/13470.html 简介 主要提供了简单易用强大的RecyclerView库,包括自定义刷新加载效果.极简通用的万能适配器 ...

  5. 深入探索Android卡顿优化(下)

    前言 成为一名优秀的Android开发,需要一份完备的知识体系,在这里,让我们一起成长为自己所想的那样~. 在上篇文章中,笔者带领大家学习了卡顿优化分析方法与工具.自动化卡顿检测方案及优化这两块内容. ...

  6. 深入探索Android内存优化

    前言 成为一名优秀的Android开发,需要一份完备的知识体系,在这里,让我们一起成长为自己所想的那样~. 本篇是Android内存优化的进阶篇,难度会比较大,建议对内存优化不是非常熟悉的前仔细看看在 ...

  7. Android学习之RecyclerView带刺的玫瑰

    上述小诗先逗比一下,接下来切入正题: 自从RecyclerView的诞生起,人们就为她贴上了高贵的标签:她灵活华丽高度可定制,而另一边ListView确已是明日黄花:人们趋之若鹜的奔向了Recycle ...

  8. 【Android 仿微信通讯录 导航分组列表-上】使用ItemDecoration为RecyclerView打造带悬停头部的分组列表

    *本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 转载请标明出处: http://blog.csdn.net/zxt0601/article/details/52355199 本文 ...

  9. RecyclerView调用notifyDataSetChanged()不起作用

    背景 上周,之前的一个朋友发消息给我,RecyclerView的notifyDataSetChanged()方法没有用.心里一想,自己之前不就是这么用的么.但是好像脑海里有看到过也有人遇到了类似的问题 ...

最新文章

  1. OC-Foundation框架
  2. WPF中使用WindowChrome自定义窗口中遇到的最大化问题
  3. java set方法不生效_使您的Java 8方法引用生效
  4. 【剑指offer】面试题40:数组中只出现一次的数字
  5. [Lucene.Net] 基本用法
  6. JavaScript中的match方法和search方法
  7. Windows 10 安装 scrapy 步骤
  8. ZooKeeper 概念讲的好
  9. 1.1 echo rem cd dir命令
  10. OpenGL学习笔记_图形渲染管线及典型渲染流程(绘制一个三角形)
  11. grafna监控Java接口_性能测试之 JVM 的监控 Grafana
  12. Rust : stevenbai.top学习站点
  13. c语言笔试面试大全,C语言基础笔试题
  14. 思科网络技术学院教程:企业中的路由和交换技术简介第十章实验总结
  15. stephen boyd著王书宁译凸优化课后题答案
  16. magicyang语录
  17. 【链块技术10期】区块链基础语言(二)——GO语言开发环境搭建
  18. 支付宝当面付(扫二维码)
  19. sql 修改表的字段属性
  20. Python实现二维离散卷积运算

热门文章

  1. 华为临阵换帅,云市场掀起“三国杀”
  2. 目标管理是项目管理的核心思想之
  3. 玄武密码(bzoj4327)(JSOI2012)
  4. JZOJ4883. 【NOIP2016提高A组集训第12场11.10】灵知的太阳信仰
  5. 魔法宝石(动态规划)
  6. 什么情形下计算机会休眠,什么是计算机休眠状态
  7. 提交给移动三个wap游戏,终于通过了一个
  8. 二维蒙特卡洛模拟居里温度_蒙特卡罗方法计算居里温度(上)
  9. 损失函数理解汇总,结合PyTorch和TensorFlow2
  10. ThreadLocal.withInitial