Android 高级编程 RecyclerView 控件的使用
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,并声明LayoutManager
与Adapter
,代码如下:
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 控件的使用相关推荐
- Android高级图片滚动控件,编写3D版的图片轮播器
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/17482089 大家好,好久不见了,最近由于工作特别繁忙,已经有一个多月的时间没写博 ...
- Android 高级编程【6个实战案例(附源码):刮刮卡、补间动画、逐帧动画、Fragment、RecyclerView、下拉刷新】
目 录 刮刮卡案例[ScratchCard] 结构图 activity_main.xml MainActivity.java 运行效果图 补间动画(Tween Animation) 逐帧动画(Fr ...
- listview控件在php的使用方法,Android_Android编程之控件ListView使用方法,本文实例讲述了Android编程之控 - phpStudy...
Android编程之控件ListView使用方法 本文实例讲述了Android编程之控件ListView使用方法.分享给大家供大家参考.具体分析如下: 控件ListView是一个重要的控件,可以被用作 ...
- Android初学二之仿微信APP实现RecyclerView控件的设计开发,实现点击事件及图片瀑布流
目录 0 实验环境 1 界面展示 2 功能说明 3 核心代码 3.1 实现RecyclerView控件的设计开发 3.2 添加了文字库assets 3.3 实现点击事件对item中的每个LinearL ...
- Android 宫格图控件MultiImageView(RecyclerView适配器中展示不定数量的图片)
Android 宫格图控件MultiImageView(RecyclerView适配器中展示不定数量的图片) 最近的github上的996ICU在IT界应该很多人听说了,不知道CSDN上什么是最受大家 ...
- 视频教程-Android Material Design 新控件-Android
Android Material Design 新控件 刘志远,北京邮电大学硕士研究生, 北京育华志远科技有限公司创始人, 育华志远教育品牌负责人,育华志远课程体系打造者. 率领团队为互联网行业培训千 ...
- Android常用酷炫控件(开源项目)github地址汇总
转载一个很牛逼的控件收集帖... 第一部分 个性化控件(View) 主要介绍那些不错个性化的 View,包括 ListView.ActionBar.Menu.ViewPager.Gallery.Gri ...
- RecyclerView控件实现横向滚动和瀑布流布局,以及RecyclerView的点击监听(项目已上传GitHub)
先附上我的GitHub项目地址: https://github.com/Skymqq/RecyclerViewTest.git 我们已经知道,ListView的拓展性不好,它只能实现纵向的滚动的效果, ...
- RecyclerView控件的基本使用(增强版的ListView)
ListView由于其强大的功能,在过去的Android开发当中可以说是贡献卓越,直到今天仍然还有不计其数的程序在继续使用着ListView.不过ListView并不是完全没有缺点的,比如说如果我们不 ...
最新文章
- 30个Python常用极简代码
- Linux免设置路由端口映射,2014/04/01 演示中设置linux路由器、端口过滤的使用、路由设置...
- 数据分析师必须会python_数据分析师必须掌握的9种数据分析方法
- python 三分类的哑编码_python数据挖掘实战 -数据预处理篇(数据可视化-空值填充-哑变量编码)...
- 最吓人的鬼故事排行榜前十名(转载)
- 《诗经》诗无邪 —— 雅篇
- python爬虫菜鸟教程-python爬虫项目(新手教程)之知乎(requests方式)
- C#做小工具的时候碰到的问题
- Postman调接口时获取Chrome浏览器Cookie数据携带发送
- 怎样搜索计算机中docx格式的文件,如何打开docx文件 打开docx文件方法
- [转]寂寞的数学家和不孤独的素数
- Excel多条件计数——COUNTIFS【获奖情况统计】
- 在nuxt中使用swiper轮播
- 商品库存盘点 门店和仓库 需要盘点的物品都可以使用 多种方式设备可以盘点商品库存 移动智能终端盘点机盘点
- Android HIDL 介绍学习之客户端调用
- 关于Java中大小写转换
- linux 启动openfire
- Json代码实战演练
- Arduino物联网开发实例教程
- why哥这里有一道Dubbo高频面试题,请查收。
热门文章
- [原创软件]体验组批量加分工具
- SDWebImage的使用说明
- 上周热点回顾(7.9-7.15)
- spring 概念理解(资料)
- java护照号码校验_学无止境之小白学java……第001天
- Linux系统更新最新版R语言方法
- ajax servlet增删改查,Servlet ajax 文件上传和JDBC+Servler用户表增删改查
- excel连接mysql 数据库
- linux 磁盘挂载sde,linux lvm挂载新的硬盘并且扩容
- down.php无法打开,php下载文件 图片不能打开,该怎么解决