RecyclerView使用探索1--了解及使用
前言
目前的项目中,基本已经使用 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--了解及使用相关推荐
- RecyclerView 悬浮/粘性头部——StickyHeaderDecoration
转载至:https://blog.csdn.net/qian520ao/article/details/76167193 ItemDecoration是recyclerView拓展的一个很好工具,支持 ...
- RecyclerView控件的基本使用(增强版的ListView)
ListView由于其强大的功能,在过去的Android开发当中可以说是贡献卓越,直到今天仍然还有不计其数的程序在继续使用着ListView.不过ListView并不是完全没有缺点的,比如说如果我们不 ...
- 将替代ListView的RecyclerView 的使用(一)
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/by317966834/article/details/36205923 RecyclerView 是 ...
- 一个漂亮而强大的RecyclerView
代码地址如下: http://www.demodashi.com/demo/13470.html 简介 主要提供了简单易用强大的RecyclerView库,包括自定义刷新加载效果.极简通用的万能适配器 ...
- 深入探索Android卡顿优化(下)
前言 成为一名优秀的Android开发,需要一份完备的知识体系,在这里,让我们一起成长为自己所想的那样~. 在上篇文章中,笔者带领大家学习了卡顿优化分析方法与工具.自动化卡顿检测方案及优化这两块内容. ...
- 深入探索Android内存优化
前言 成为一名优秀的Android开发,需要一份完备的知识体系,在这里,让我们一起成长为自己所想的那样~. 本篇是Android内存优化的进阶篇,难度会比较大,建议对内存优化不是非常熟悉的前仔细看看在 ...
- Android学习之RecyclerView带刺的玫瑰
上述小诗先逗比一下,接下来切入正题: 自从RecyclerView的诞生起,人们就为她贴上了高贵的标签:她灵活华丽高度可定制,而另一边ListView确已是明日黄花:人们趋之若鹜的奔向了Recycle ...
- 【Android 仿微信通讯录 导航分组列表-上】使用ItemDecoration为RecyclerView打造带悬停头部的分组列表
*本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 转载请标明出处: http://blog.csdn.net/zxt0601/article/details/52355199 本文 ...
- RecyclerView调用notifyDataSetChanged()不起作用
背景 上周,之前的一个朋友发消息给我,RecyclerView的notifyDataSetChanged()方法没有用.心里一想,自己之前不就是这么用的么.但是好像脑海里有看到过也有人遇到了类似的问题 ...
最新文章
- OC-Foundation框架
- WPF中使用WindowChrome自定义窗口中遇到的最大化问题
- java set方法不生效_使您的Java 8方法引用生效
- 【剑指offer】面试题40:数组中只出现一次的数字
- [Lucene.Net] 基本用法
- JavaScript中的match方法和search方法
- Windows 10 安装 scrapy 步骤
- ZooKeeper 概念讲的好
- 1.1 echo rem cd dir命令
- OpenGL学习笔记_图形渲染管线及典型渲染流程(绘制一个三角形)
- grafna监控Java接口_性能测试之 JVM 的监控 Grafana
- Rust : stevenbai.top学习站点
- c语言笔试面试大全,C语言基础笔试题
- 思科网络技术学院教程:企业中的路由和交换技术简介第十章实验总结
- stephen boyd著王书宁译凸优化课后题答案
- magicyang语录
- 【链块技术10期】区块链基础语言(二)——GO语言开发环境搭建
- 支付宝当面付(扫二维码)
- sql 修改表的字段属性
- Python实现二维离散卷积运算
热门文章
- 华为临阵换帅,云市场掀起“三国杀”
- 目标管理是项目管理的核心思想之
- 玄武密码(bzoj4327)(JSOI2012)
- JZOJ4883. 【NOIP2016提高A组集训第12场11.10】灵知的太阳信仰
- 魔法宝石(动态规划)
- 什么情形下计算机会休眠,什么是计算机休眠状态
- 提交给移动三个wap游戏,终于通过了一个
- 二维蒙特卡洛模拟居里温度_蒙特卡罗方法计算居里温度(上)
- 损失函数理解汇总,结合PyTorch和TensorFlow2
- ThreadLocal.withInitial