RecyclerView
一种可以替换掉listview gridview 瀑布流等控件的新视图控件,控制视图回收和复用 ==优化内存可以替换listview
与listview的不同之处是:listview缓存convertview不同的是,Recyclerview缓存的是viewholder.
提供了一种插拔式的体验,高度的解耦,异常的灵活,通过设置它提供的不同LayoutManager,ItemDecoration , ItemAnimator实现想要的效果
1、RecyclerView.Adapter 适配器
2、RecyclerView.ItemDecoration 每个item附加的子视图,可用来绘制Divider,设置padding等
3、RecyclerView.ItemAnimator 负责添加、删除数据时的动画效果
4、RecyclerView.ViewHolder 缓存的对象
5、RecyclerView.LayoutManager 布局器,负责Item视图的布局

具体使用1、activity:

	private Activity activity;
private List<PicData> mpicDatas;
private MyAdapter adapter; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recycleview);
activity = this; // 获取recycleView 设置布局管理器 设置items 分割线 设置 item 动画
RecyclerView my_recycleview = (RecyclerView) this
.findViewById(R.id.my_recycleview);
my_recycleview.setLayoutManager(new LinearLayoutManager(
getApplicationContext()));
my_recycleview.setItemAnimator(new DefaultItemAnimator());// 设置默认的动画
mpicDatas = Tool.getData();
adapter = new MyAdapter(mpicDatas);
adapter.setOnMyItemClickListener(new OnMyItemClickListener() { @Override
public void OnItemClick(View view, int position) {
Toast.makeText(activity, "Click" + mpicDatas.get(position),
Toast.LENGTH_SHORT).show();
adapter.removeData(position);
} @Override
public void OnItemLongClick(View view, int position) {
Toast.makeText(activity, "LongClick" + mpicDatas.get(position),
Toast.LENGTH_SHORT).show();
adapter.addData(position, mpicDatas.get(position));
}
});
my_recycleview.setAdapter(adapter);
// 自定义动画有问题
// my_recycleview.setItemAnimator(new MyItemAnimator());
}

  2、适配器 要处理点击事件和对应的视图处理:

// 提供 个数 和viewholder 已经绑定数据 onBindViewHolder
// 触发事件 和动画效果需要自己灵活处理
public class MyAdapter extends RecyclerView.Adapter<ViewHolder> {
List<PicData> mpicdatas;
private OnMyItemClickListener mOnItemClickListener;
public MyAdapter() {
}
public MyAdapter(List<PicData> mpicdatas) {
this.mpicdatas = mpicdatas;
}
public MyAdapter(List<PicData> mpicdatas,
OnMyItemClickListener mOnItemClickListener) {
this.mpicdatas = mpicdatas;
this.mOnItemClickListener = mOnItemClickListener;
} // 移除数据
public void removeData(int po) {
if(po>mpicdatas.size()-1){
return;
}
mpicdatas.remove(po);
notifyItemRemoved(po);
} // 指定位置添加数据
public void addData(int po, PicData mPicData) { if(po>mpicdatas.size()){
po=mpicdatas.size();
}
if(po<0){
po=0;
}
mpicdatas.add(po, mPicData);
notifyItemInserted(po);
} // 获取对象个数
@Override
public int getItemCount() {
return mpicdatas.size();
} // 具体用于绑定对应数据
@Override
public void onBindViewHolder(ViewHolder mViewHolder1, int arg1) {
final MyViewHolder mViewHolder = (MyViewHolder) mViewHolder1;
PicData mPicData = mpicdatas.get(arg1);
// mViewHolder.im.setBackground(background)
mViewHolder.tv_des.setText(mPicData.getDes());
mViewHolder.tv_name.setText(mPicData.getName());
// 设置点击事件
if (mOnItemClickListener != null) {
// 判断是否设置过点击事件 如果设置过 不再设置 防止重复创建 增加内存开销
if (!mViewHolder.itemView.hasOnClickListeners()) {
mViewHolder.itemView
.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
int po = mViewHolder.getPosition();
mOnItemClickListener.OnItemClick(v, po);
}
}); mViewHolder.itemView
.setOnLongClickListener(new OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
int po = mViewHolder.getPosition();
mOnItemClickListener.OnItemLongClick(v, po);
return true;
}
});
}
}
} // 创建一个可返回的holder 用于回收和复用
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int arg1) {
MyViewHolder holder = new MyViewHolder(LayoutInflater.from(
RecycleviewActivity.this).inflate(
R.layout.activity_recycleview_item, parent, false));
return holder;
} // viewholder 静态内部类
class MyViewHolder extends ViewHolder {
private TextView tv_name;
private TextView tv_des;
private ImageView im; public MyViewHolder(View view) {
super(view);
tv_name = (TextView) view.findViewById(R.id.tv_title);
tv_des = (TextView) view.findViewById(R.id.tv_des);
im = (ImageView) view.findViewById(R.id.im_holder);
}
} // 设置点击事件
public void setOnMyItemClickListener(
OnMyItemClickListener mOnItemClickListener) {
this.mOnItemClickListener = mOnItemClickListener;
} }

  3、点击事件的接口

import android.view.View;

public interface OnMyItemClickListener {
public void OnItemClick(View view, int position); public void OnItemLongClick(View view, int position);
}

  4、model

public class PicData {
private String name;
private String des;
private String path; public PicData() {
} public PicData(String name, String des, String path) {
this.des = des;
this.name = name;
this.path = path;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getDes() {
return des;
} public void setDes(String des) {
this.des = des;
} public String getPath() {
return path;
} public void setPath(String path) {
this.path = path;
} }

  5、工具

public class Tool {

	/**
* 获取对应的测试数据
* @return
*/
public static List<PicData> getData(){
String image[]={
"http://imgsrc.baidu.com/forum/w%3D580/sign=f786dbba8744ebf86d716437e9f8d736/9fe5546034a85edf11571c9a49540923df547580.jpg",
"http://upload.wendu.cn/2016/0225/thumb_300_0_1456366681530.jpg",
"http://upload.wendu.cn/2016/0225/thumb_300_0_1456386396842.jpg",
"http://upload.wendu.cn/2016/0225/thumb_300_0_1456386399211.jpg",
"http://upload.wendu.cn/2016/0217/thumb_300_0_1455684747338.jpg",
"http://upload.wendu.cn/2016/0203/thumb_300_0_1454499202633.png",
"http://upload.wendu.cn/2016/0122/thumb_300_0_1453463650114.jpg",
"http://upload.wendu.cn/2016/0123/thumb_213_160_1453513340130.png",
"http://upload.wendu.cn/2016/0129/thumb_300_0_1454030278472.jpg"
}; List<PicData> mlist=new ArrayList<PicData>();
for(int i=0;i<image.length;i++){
mlist.add(new PicData("第几张"+i, "测试第几张图片 测试数据"+i, image[i]));
}
return mlist; } }

  6、布局

<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:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" > <android.support.v7.widget.RecyclerView
android:id="@+id/my_recycleview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/> </RelativeLayout>

  

Android RecyclerView使用(一)的更多相关文章

  1. Android RecyclerView 实现支付宝首页效果

    Android RecyclerView 实现支付宝首页效果 [TOC] 虽然我本人不喜欢支付宝的,但是这个网格本身其实还是不错的,项目更新中更改了一个布局为网格模式,类似支付宝.(估计是产品抄袭的= ...

  2. Android RecyclerView的基本使用

    Android RecyclerView 在去年的Google I/O大会上就推出来了,以前经常使用的ListView 继承的是AbsListView,而RecyclerView则直接继承 ViewG ...

  3. Android RecyclerView单击、长按事件:基于OnItemTouchListener +GestureDetector标准实现(二),封装抽取成通用工具类

     Android RecyclerView单击.长按事件:基于OnItemTouchListener +GestureDetector标准实现(二),封装抽取成通用工具类 我写的附录文章2,介绍了 ...

  4. Android RecyclerView单击、长按事件标准实现:基于OnItemTouchListener + GestureDetector

     Android RecyclerView单击.长按事件:基于OnItemTouchListener + GestureDetector标准实现 Android RecyclerView虽然拥有L ...

  5. Android RecyclerView添加Header头部

     Android RecyclerView添加Header头部 Android RecyclerView不像以前的ListView那样直接添加头部,如果要给RecyclerView增加头部,则需要 ...

  6. Android RecyclerView(瀑布流)水平/垂直方向分割线

     Android RecyclerView(瀑布流)水平/垂直方向分割线 Android RecyclerView不像过去的ListView那样随意的设置水平方向的分割线,如果要实现Recycle ...

  7. 极简的Android RecyclerView Adapter(使用DataBinding)

    阅读本篇文章需要读者对Android Databinding和RecyclerView有一定的了解. 简介 我们知道,DataBinding的核心理念是数据驱动.数据驱动驱动的目标就是View,使用D ...

  8. 浅谈Android RecyclerView

    Android RecyclerView 是Android5.0推出来的,导入support-v7包即可使用. 个人体验来说,RecyclerView绝对是一款功能强大的控件. 首先总结下Recycl ...

  9. [Android]RecyclerView的简单演示样例

    去年google的IO上就展示了一个新的ListView.它就是RecyclerView. 下面是官方的说明,我英语能力有限,只是我大概这么理解:RecyclerView会比ListView更具有拓展 ...

  10. (转载) Android RecyclerView 使用完全解析 体验艺术般的控件

    Android RecyclerView 使用完全解析 体验艺术般的控件 标签: Recyclerviewpager瀑布流 2015-04-16 09:07 721474人阅读 评论(458) 收藏  ...

随机推荐

  1. Git (1)

    对于程序员来说,版本管理工具可称得上是必需品.越来越多的版本管理开始使用Git,特别是Github的流行更加使得大家对于Git越来越关注.因此对于Git的学习是非常必要和重要的. 先看几个好玩的数据: ...

  2. Java之网络请求工具类(依赖:org.apache.http;注:HttpClient 4.4,HttpCore 4.4)

    到此处可以去下载依赖包:http://hc.apache.org/downloads.cgi import java.util.List; import org.apache.http.HttpSta ...

  3. NLPIR.user Not valid license or your license expired! Please feel free to contact pipy_zhang@msn.com

    NLPIR.user Not valid license or your license expired! Please feel free to contact pipy_zhang@msn.com ...

  4. 互联网 免费的WebService接口

    winform开发暂告于段落,最近再用webservice写接口,接下来的一段时间应该偏向于此方向. (转)一批的免费webservice接口,没有技术含量,只是写在这里做个记忆 股票行情数据 WEB ...

  5. js学习--DOM操作详解大全 前奏(认识DOM)

    一 . 节点属性 DOM 是树型结构,相应的,可以通过一些节点属性来遍历节点树: 方法 说明 nodeName 节点名称,相当于tagName.属性节点返回属性名,文本节点返回#text.nodeNa ...

  6. win8 + ubuntu14.04 安装步骤

    一.首先,从硬盘上划分一个空闲分区(推荐最少20G,每个人也可以按照自己的需要自行设定).记住各个分区的容量,方便安装时辨认.并从Ubuntu官方网站上下载Ubuntu 14.04 LTS 光盘镜像. ...

  7. 中国天气网接口返回json格式分析及接口(XML、图片接口)说明

    实时天气: city        "北京"//城市 cityid      "101010100"//城市编码 temp        "17&qu ...

  8. 几个模式识别和计算机视觉相关的Matlab工具箱

    模式识别.计算机视觉.图像处理等领域大部分是对一些图像等数据的处理,比较常用的语言是C++和Matlab,相应也对应很多库,象opencv等,都是很好用功能也很强大,但是对于数据处理更方便的应该还是M ...

  9. Uva_11916 Emoogle Grid

    题目链接 题意: 有个N X M的棋盘, 有K种颜色, 有B个不可涂色的位置, 共有R种涂色方案. 1)每个可涂色的位置必须涂上一种颜色 2)不可涂色位置不能涂色 3)每个位置必须从K种颜色中选出一种 ...

  10. Codeforces 712C Memory and De-Evolution

    Description Memory is now interested in the de-evolution of objects, specifically triangles. He star ...