Android最新组件RecyclerView,替代ListView
转载请注明出处:http://blog.csdn.net/allen315410/article/details/40379159
万众瞩目的android最新5.0版本号不久前已经正式公布了,对于我这样对新事物不感冒的人来说,自然也是会关注的,除了新的android5.0带来的新的UI设计和用户体验之外,最让android程序猿感兴趣的是5.0版本号的sdk和一大堆新的API。5.0据说是额外添加或者改动了5000个API,新增了一些新的组件,以下介绍的RecyclerView就是当中之中的一个,有人说Google设计出的RecyclerView是为了替代一直经常使用的ListView的,所以既然如此,我们就没理由不看看这个“传说”中的RecyclerView是怎么使用的了。
RecyclerView简单介绍
该RecyclerView widget是一种更先进的柔性版的ListView。这个小工具是一个容器,用于显示,能很有效地维护了意见数量有限,滚动大的数据集。使用 RecyclerView当你拥有的数据的集合,它的元素在执行时改变基于用户行为和网络事件的小部件。
该RecyclerView类简化,提供显示和处理大数据集:
定位项目布局管理器
默认的动画为公用项的操作,比如删除或添加的项目
您还能够在自己定义的布局管理器和动画的灵活性RecyclerView部件。
要使用RecyclerView小部件,你必须指定一个适配器和一个布局管理器。要创建一个适配器,扩展RecyclerView.Adapter类。实施的细节取决于你的数据集的详细情况和意见的类型。欲了解很多其它信息,请參见示比例如以下。
布局管理器 A的内部位置的项目意见RecyclerView,并确定何时再利用项目的看法不再对用户可见。重用(或回收)的图,布局管理器可能会问适配器与数据集不同的元素替换视图的内容。以这样的方式回收的观点提高通过避免产生不必要的视图或运行昂贵性能findViewById()的查找。
RecyclerView提供这些内置的布局管理器:
LinearLayoutManager 显示在垂直或水平滚动列表项。
GridLayoutManager 显示在网格中的项目。
StaggeredGridLayoutManager 显示了交错网格项目。
要创建自己定义布局管理器,扩展RecyclerView.LayoutManager类。
动画
动画的加入和删除项目中默认启用的RecyclerView。要自己定义这些动画,延长 RecyclerView.ItemAnimator类,并使用RecyclerView.setItemAnimator() 方法。
以上内容来自Google官方文档的翻译,翻译比較生涩(我这英文水平,哎~~对付自己还行),以下直接上一个Demo看看详细的使用方法。
RecyclerView的使用方法
以下简介制作一个小Demo,来一步步分析一下RecyclerView的使用方法。首先说明一下,RecyclerView是android.support.v7包下提供的组件,所以须要使用RecyclerView时,须要下载这个包,因为我已经将SDK升级到最新版本号——API21,所以非常easy在/sdk/extras/android/support/v7/appcompat/libs文件夹下找到这个jar以及源代码,建议先升级sdk,再动手做!实在不想动手的下载的,点击博文下方的链接下载源代码,源代码里有RecyclerView的JAR包。
主界面布局,activity_main.xml
<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" > <android.support.v7.widget.RecyclerView
android:id="@+id/recyclerview"
android:layout_width="match_parent"
android:layout_height="80dp"
android:layout_centerVertical="true"
android:background="@android:color/transparent"
android:scrollbars="none" /> </RelativeLayout>
Item布局,item_recyclerview.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="120dp"
android:layout_height="120dp" > <ImageView
android:id="@+id/iv_image"
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:scaleType="centerCrop" /> </RelativeLayout>
RecyclerView的数据适配器,MyAdapter.java
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
private int[] mDataset; // 外面传入的数据
public static class ViewHolder extends RecyclerView.ViewHolder {
ImageView mImageView;
// TODO Auto-generated method stub
public ViewHolder(View v) {
super(v);
}
}
public MyAdapter(int[] mDataset) {
this.mDataset = mDataset;
}
/**
* 获取总的条目数量
*/
@Override
public int getItemCount() {
// TODO Auto-generated method stub
return mDataset.length;
}
/**
* 创建ViewHolder
*/
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
// TODO Auto-generated method stub
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_recycleview, parent, false);
ViewHolder holder = new ViewHolder(v);
holder.mImageView = (ImageView) v.findViewById(R.id.iv_image);
return holder;
}
/**
* 将数据绑定到ViewHolder上
*/
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
// TODO Auto-generated method stub
holder.mImageView.setImageResource(mDataset[position]);
}
}
从上面能够看出这个数据适配器跟ListView用的BaseAdapter上比,已经发生了非常大的变化。首先数据适配器须要继承RecyclerView.Adapter<VH>类,该类是个泛型类,泛型类型也是ViewHolder,这个ViewHolder毋庸置疑就是实现组件复用的,Google已经帮我们定义好了,在RecyclerView里是个内部类,可是详细实现还是扔给android App开发人员去实现,须要在适配器类建立一个内部类,而且继承RecyclerView,ViewHolder,在这个内部类里面定义出Item布局上全部须要复用的组件,最后将这个内部类作为泛型传递给RecyclerView.Adapter<VH>,实现须要复写的3个方法:
getItemCount() 获取Item的总数。
onCreateViewHolder(ViewGroup parent, int viewType) 创建ViewHolder。
onBindViewHolder(ViewHolder holder, int position) 将数据绑定到ViewHolder。
与ListView数据适配的对照
ListView里面有个getView()方法返回的View是Item的布局,那么这个RecyclerView的Item的布局在哪控制?事实上是这种,RecyclerView对ViewHolder也进行了一定的封装,我们创建的ViewHolder必须继承RecyclerView.ViewHolder,这个RecyclerView.ViewHolder的构造时必须传入一个View,这个View相当于我们ListView的getView()中的convertView (即:我们须要inflate的item布局须要传入)。
另一点,ListView中convertView是复用的,在RecyclerView中,是把ViewHolder作为缓存的单位了,然后convertView作为ViewHolder的成员变量保持在ViewHolder中,也就是说,如果没有屏幕显示10个条目,则会创建10个ViewHolder缓存起来,每次复用的是ViewHolder,所以他把getView这种方法变为了onCreateViewHolder。
最后,就在Activity里使用这个RecyclerView,MainActivity.java
public class MainActivity extends Activity {
/** RecyclerView对象 */
private RecyclerView recyclerView;
/** 图片资源 */
private int[] mDataset;
/** 数据适配器 */
private MyAdapter mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView = (RecyclerView) findViewById(R.id.recyclerview);
// 初始化图片数据
mDataset = new int[] { R.drawable.a, R.drawable.b, //
R.drawable.c, R.drawable.d, R.drawable.e, //
R.drawable.f, R.drawable.g, R.drawable.h, R.drawable.i };
// 设置布局管理器
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
recyclerView.setLayoutManager(linearLayoutManager);
// 设置适配器
mAdapter = new MyAdapter(mDataset);
recyclerView.setAdapter(mAdapter);
}
}
在MainActivity使用RecyclerView如同使用ListView一样的简单,唯一不同的地方就是,须要给RecyclerView设置一个布局管理器,Google为我们提供了3种不同的布局管理(具体请看最上面的简单介绍),这里我使用的LinearLayoutmanager,而且设置布局为水平显示。 好了,关于RecyclerView的基本使用方法讲完了,那个关于RecyclerView的另外两个布局管理器就临时不说了,大同小异。以下是执行效果图
为RecyclerView设置事件回调
再使用RecyclerView组件时,发现了一个令人“痛心疾首”的问题:RecyclerView竟然没有点击Item的事件监听设置,类似于ListView中起码有个setOnItemClickListener方法,用于监听Item点击并作出对应的逻辑处理。可是翻遍了RecyclerView的API,都没有发现这个或者类似这个功能的方法可用,这不得不说是个“悲剧”,还听说这个是为了替代ListView的,看来并非这种,请Google出来解释解释啊!
好了,Google应该最近是不会解释的了,可是我们得自己想办法解决问题,就是为RecyclerView加入一个回调函数,这个倒不难吧!实在无法领会的,能够看看我前面的那篇博文,Android自己定义组件——仿ios滑动button,里面有一些相关的使用方法。以下是我在Adapter里加入的回调函数。
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
private int[] mDataset; // 外面传入的数据
/**
* Item的回调接口
*
*/
public interface OnItemClickListener {
void onItemClickListener(View view, int position);
}
private OnItemClickListener listener; // 点击Item的回调对象
/**
* 设置回调监听
*
* @param listener
*/
public void setOnItemClickListener(OnItemClickListener listener) {
this.listener = listener;
}
public static class ViewHolder extends RecyclerView.ViewHolder {
ImageView mImageView;
// TODO Auto-generated method stub
public ViewHolder(View v) {
super(v);
}
}
public MyAdapter(int[] mDataset) {
this.mDataset = mDataset;
}
/**
* 获取总的条目数量
*/
@Override
public int getItemCount() {
// TODO Auto-generated method stub
return mDataset.length;
}
/**
* 创建ViewHolder
*/
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
// TODO Auto-generated method stub
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_recycleview, parent, false);
ViewHolder holder = new ViewHolder(v);
holder.mImageView = (ImageView) v.findViewById(R.id.iv_image);
return holder;
}
/**
* 将数据绑定到ViewHolder上
*/
@Override
public void onBindViewHolder(ViewHolder holder, final int position) {
// TODO Auto-generated method stub
holder.mImageView.setImageResource(mDataset[position]);
if (listener != null) {
holder.mImageView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
listener.onItemClickListener(v, position);
}
});
}
}
}
首先在Adapter里定义一个内部接口,接口内定义回调函数,然后向外暴露一个设置这个接口对象的方法,通过这种方法设置内部接口的对象,最后在ViewHolder绑定数据的方法中,通过接口对象调用接口方法,将相关信息传递出去。以下是在MainActivity里设置这个监听方法:
mAdapter.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClickListener(View view, int position) {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this, position + "", Toast.LENGTH_SHORT).show();
}
});
下面是执行效果图:
Android最新组件RecyclerView,替代ListView的更多相关文章
- [Android]使用RecyclerView替代ListView(四:SeizeRecyclerView)
以下内容为原创,欢迎转载,转载请注明 来自天天博客:<> [Android]使用RecyclerView替代ListView(四:SeizeRecyclerView) 在RecyclerV ...
- [Android]使用RecyclerView替代ListView(三)
以下内容为原创,转载请注明: 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/4268097.html 这次来使用RecyclerView实现Pinn ...
- [Android]使用RecyclerView替代ListView(二)
以下内容为原创,转载请注明: 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/4242541.html 以前写过一篇“[Android]使用Adapte ...
- [Android]使用RecyclerView替代ListView(一)
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/4232560.html RecyclerView是一个比List ...
- Android笔记——RecyclerView替代ListView
ListView是常用列表控件,但设置Adapter时自定义代码较为复杂,因此Android3.0后,增加RecyclerView替代ListView RecyclerView没有提供OnItemCl ...
- Android新组件RecyclerView介绍,其效率更好
今天我们首先来说为什么要介绍这个新组件RecyclerView,因为前几天我发布了一个常用面试题ListView的复用及如何优化的文章,介绍给一些开发者,但是我看到有关的反馈说:现在都不再用listv ...
- android新组件RecyclerView使用介绍和进阶使用,替用Gallery
简介: RecyclerView是support-v7包中的新组件,是一个强大的滑动组件,与经典的ListView相比,同样拥有item回收复用的功能,但是直接把viewholder的实现封装起来,用 ...
- 【转】android新组件RecyclerView使用介绍和进阶使用,替用Gallery
简介: RecyclerView是support-v7包中的新组件,是一个强大的滑动组件,与经典的ListView相比,同样拥有item回收复用的功能,但是直接把viewholder的实现封装起来,用 ...
- Android控件RecyclerView与ListView的异同
在我的一篇介绍Android新控件RecyclerView的博客(Android L新控件RecyclerView简介)中,一个读者留言说RecyclerView跟ListView之间好像没有什么不同 ...
随机推荐
- dbms_stats
dbms_stats全部的功能包例如以下: GATHER_INDEX_STATS:分析索引信息 GATHER_TABLE_STATS:分析表信息,当cascade为true时,分析表.列(索引)信息 ...
- leetcode笔记:Word Break
一. 题目描写叙述 Given a string s and a dictionary of words dict, determine if s can be segmented into a sp ...
- Socket 长连接与短连接,心跳
长连接与短连接 所谓长连接,指在一个TCP连接上可以连续发送多个数据包,在TCP连接保持期间,如果没有数据包发送,需要双方发检测包以维持此连接,一般需要自己做在线维持. 短连接是指通信双方有数据交互时 ...
- 逻辑与和逻辑或:&& 、||
逻辑或:首先看左边是真还是假(除了那5个都是真),如果为真,返回左边值,如果为假,返回右边的值 逻辑与:和逻辑或相同,先看左边的值是真是假,如果左边为真返回右边的值,左边为假返回左边的值 在两者同时出 ...
- 互信息 & 卡方 - 文本挖掘
在做文本挖掘,特别是有监督的学习时,常常需要从文本中提取特征,提取出对学习有价值的分类,而不是把所有的词都用上,因此一些词对分类的作用不大,比如“的.是.在.了”等停用词.这里介绍两种常用的特征选择方 ...
- Qt的焦点策略
Qt的窗口部件在图形用户界面中按用户的习惯的方式来处理键盘焦点.基本出发点是用户的击键能定向到屏幕上窗口中的任何一个,和在窗口中任何一个部件中.当用户按下一个键,他们期望键盘焦点能够到达正确的位置,并 ...
- 三个Bootstrap免费字体和图标库
前言:Bootstrap 简洁.直观.强悍.移动设备优先的前端开发框架,让web开发更迅速.简单 ,深入了解 Bootstrap 底层结构的关键部分,包括我们让 web 开发变得更好.更快, 组件无数 ...
- /bin/bash^M: bad interpreter: 没有那个文件或文件夹
执行脚本时出现了这样一个错误,打开之后并没有找到所谓的^M,查了之后才知道原来是文件格式的问题,也就是linux和windows之间的不全然兼容... 详细细节无论,假设验证: vim test.sh ...
- Linux下交叉编译gdb,gdbserver+gdb的使用以及通过gdb调试core文件
交叉编译gdb和gdbserver 1.下载gdb:下载地址为:http://ftp.gnu.org/gnu/gdb/按照一般的想法,最新版本越好,因此下载7.2这个版本.当然,凡事无绝对.我们以gd ...
- Android Studio2.0 Beta 2版本号更新说明及注意事项
我们刚刚向canary channel推送了Android Studio2.0 Beta 2版本号 老毕译注: ---------- canary channel: 金丝雀版本号,平均1到2周就会更新 ...