(转载请注明出处:http://www.kennethyo.me/post/android/recyclerviewchu-ji-shi-yong)

RecyclerView是Android在v7包中包括了一个新的widget。RecyclerView是一个ListView进阶版,但不继承与AdapterView。相比ListViewRecyclerView更加灵活和先进。

1。导入RecyclerView

首先要保证SDK ToolsAndroid
Support Repository
为最新版。

例如以下图:



其次,在你的demoproject里选中Project Structurebutton,而且选择app —— Dependencies —— “+” —— Library dependency,去加入支持包,例如以下图:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva2VubmV0aHlv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

最后。在新的对话框里选中com.android.support:recyclerview-v7:21.0.0,点击OK。

例如以下图:



这里就顺利的导入了RecyclerView

2,使用RecyclerView

在布局文件里使用RecyclerView。跟其它自己定义控件一样,例如以下:

<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=".MainActivity"> <android.support.v7.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>

由于日常开发中,我们大多数都是依照UI去布局每一个item,所以这里我没与图省事用Android自带的布局。例如以下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"> <TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="48dp"
android:textStyle="bold"
android:background="@android:color/holo_blue_light"
android:textColor="@android:color/holo_red_light"
android:gravity="center_vertical"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:text="New Text" /> </LinearLayout>

以下就是代码了:

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView = (RecyclerView) findViewById(R.id.recyclerView); //LinearLayoutManager能够自己定义实现不同的动画效果和布局效果
//这里设置为LinearLayoutManager.HORIZONTAL变成为了一个能够横向滑动的ListView,赞不赞?
LinearLayoutManager layoutManager = new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false);
recyclerView.setLayoutManager(layoutManager);
recyclerView.setHasFixedSize(false);//adapter的改变不会改变RecyclerView的大小 String[] strings = new String[50];
for (int i = 0;i<50;i++){
strings[i] = String.valueOf(i);
} StringRecyclerAdapter adapter = new StringRecyclerAdapter(strings); recyclerView.setAdapter(adapter); }

能够明白看到的是,RecyclerView通过(RecyclerView)
findViewById(R.id.recyclerView)
初始化之后,不仅要像ListView一样要放入Adapter进行数据和布局的适配,并且还要额外加入一个LinearLayoutManager

这个Manager就是我们的布局管理工具类,这里不仅能够用常规的竖直方向布局。还有横向的滑动的布局,以后再也不会由于没有横向滑动的ListView去头疼自己定义了。

通过自己定义LinearLayoutManager也能够实现不同的动画效果,和移动效果。

RecyclerView的Adapter和ListView的Adapter也是不同的。RecyclerView的Adapter要继承RecyclerView.Adapter<VH
extends ViewHolder>
,而且ViewHolder要继承与ViewHolder.RecyclerView。详细代码例如以下:

public class StringRecyclerAdapter extends RecyclerView.Adapter<StringRecyclerAdapter.ViewHolder> {
private String[] strings; public StringRecyclerAdapter(String[] strings) {
this.strings = strings;
} @Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View view = View.inflate(viewGroup.getContext(), R.layout.adapter_string_recylcer, null); //这里发现不给item布局加入LayoutParams,会直接默觉得WRAP_CONTENT。WRAP_CONTENT布局。 view.setPadding(20, 0,0, 0);
view.setFocusable(true);
RecyclerView.LayoutParams lp = new RecyclerView.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
lp.leftMargin = 10;
lp.rightMargin = 5;
lp.topMargin = 20;
lp.bottomMargin = 15;
view.setLayoutParams(lp); ViewHolder viewHolder = new ViewHolder(view);
return viewHolder;
} @Override
public void onBindViewHolder(ViewHolder viewHolder, int i) {
viewHolder.textView.setText(StringRecyclerAdapter.class.getSimpleName() + getValueAt(i));
} public String getValueAt(int i) {
return strings[i];
} @Override
public int getItemCount() {
return this.strings == null ? 0 : strings.length;
} public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
public TextView textView; public ViewHolder(View itemView) {
super(itemView);
textView = (TextView) itemView.findViewById(R.id.textView);
//由于RecyclerView没用setOnItemClickListener,所以在这里实现了点击事件
//况且,如今有越来越多的设计,会在每一个item点击不同位置,有不同的响应
textView.setOnClickListener(this);
} @Override
public void onClick(View v) {
Toast.makeText(v.getContext(),((TextView)v).getText(),Toast.LENGTH_SHORT).show();
}
}
}

onCreateViewHolder方法中,我们须要把载入布局和ViewHolder绑定起来。这里有个问题。不知道是Android的bug。还是有益这么设计的,须要我们主动写代码给item设置LayoutParams

onBindViewHolder中负责数据绑定。

这里有一个问题,RecyclerView没有setOnItemClickListener方法,所以我在里面对TextView加入了点击事件,如今有越来越多的设计,会在每一个item点击不同位置。有不同的响应。

Demo链接

版权声明:本文博客原创文章。博客,未经同意,不得转载。

RecyclerView0基于使用的更多相关文章

  1. 最近帮客户实施的基于SQL Server AlwaysOn跨机房切换项目

    最近帮客户实施的基于SQL Server AlwaysOn跨机房切换项目 最近一个来自重庆的客户找到走起君,客户的业务是做移动互联网支付,是微信支付收单渠道合作伙伴,数据库里存储的是支付流水和交易流水 ...

  2. 自定义基于 VLC 的视频播放器

    前言(蛋疼的背景故事) 前段时间,接了一个小项目,有个需求是要在系统待机一段时间以后,循环播放 MV(类似于 Windows 系统的屏幕保护). 听到这个需求,我首先想到的是 MediaPlayer ...

  3. 构建一个基本的前端自动化开发环境 —— 基于 Gulp 的前端集成解决方案(四)

    通过前面几节的准备工作,对于 npm / node / gulp 应该已经有了基本的认识,本节主要介绍如何构建一个基本的前端自动化开发环境. 下面将逐步构建一个可以自动编译 sass 文件.压缩 ja ...

  4. 常用 Gulp 插件汇总 —— 基于 Gulp 的前端集成解决方案(三)

    前两篇文章讨论了 Gulp 的安装部署及基本概念,借助于 Gulp 强大的 插件生态 可以完成很多常见的和不常见的任务.本文主要汇总常用的 Gulp 插件及其基本使用,需要读者对 Gulp 有一个基本 ...

  5. 基于spring注解AOP的异常处理

    一.前言 项目刚刚开发的时候,并没有做好充足的准备.开发到一定程度的时候才会想到还有一些问题没有解决.就比如今天我要说的一个问题:异常的处理.写程序的时候一般都会通过try...catch...fin ...

  6. Spring基于AOP的事务管理

                                  Spring基于AOP的事务管理 事务 事务是一系列动作,这一系列动作综合在一起组成一个完整的工作单元,如果有任何一个动作执行失败,那么事务 ...

  7. 基于本地存储的kvm虚拟机在线迁移

    基于本地存储的kvm虚拟机在线迁移 kvm虚拟机迁移分为4种(1)热迁移基于共享存储(2)热迁移基于本地存储(3)冷迁移基于共享存储(4)冷迁移基于本地存储 这里介绍的是基于本地存储的热迁移 动态块迁 ...

  8. 使用C#处理基于比特流的数据

    使用C#处理基于比特流的数据 0x00 起因 最近需要处理一些基于比特流的数据,计算机处理数据一般都是以byte(8bit)为单位的,使用BinaryReader读取的数据也是如此,即使读取bool型 ...

  9. ABP教程-打造一个《电话簿项目》-目录-MPA版本-基于ABP1.13版本

    此系列文章会进行不定期的更新,应该会有6章左右. 感兴趣的朋友可以跟着看看,本教程适合已经看过ABP的文档但是又无从下手的小伙伴们. 初衷: 发布系列教程的原因是发现ABP在园子火了很久,但是发现还是 ...

随机推荐

  1. gustafson,Sun-Ni,Amdahl

    gustafson 定律由 John Gustafson首先提出.描述:系统优化某部件所获得的系统性能的改善程度,取决于该部件被使用的频率,或所占总执行时间的比例. Gustafson定理中,加速比与 ...

  2. Android-IA Power Manager (S3)

    Sleep and wake up

  3. UVA 11324 - The Largest Clique(强连通分量+缩点)

    UVA 11324 - The Largest Clique 题目链接 题意:给定一个有向图,要求找一个集合,使得集合内随意两点(u, v)要么u能到v,要么v能到u,问最大能选几个点 思路:强连通分 ...

  4. 【转】.net IL 指令解释速查

    名称 说明 Add 将两个值相加并将结果推送到计算堆栈上. Add.Ovf 将两个整数相加,执行溢出检查,并且将结果推送到计算堆栈上. Add.Ovf.Un 将两个无符号整数值相加,执行溢出检查,并且 ...

  5. Python3.2官方文件翻译--课堂笔记和异常是阶级

    6.7备注 有时喜欢Pasca在"录"和C中"数据体"的数据类型很实用.集合一些数据项. 一个空类定义能够清楚地显示: class Employee: pass ...

  6. 潜水JVM

    原文地址:http://blog.jamesdbloom.com/JVMInternals.html(转载请注明出处和本文地址英文原文) 本文简要解析JVM的内部结构.下图显示了一个典型的一块JVM( ...

  7. json与jsonp区别浅析(json才是目的,jsonp只是手段) (转)

    一言以蔽之,json返回的是一串数据:而jsonp返回的是脚本代码(包含一个函数调用): JSON其实就是JavaScript中的一个对象,跟var obj={}在质上完全一样,只是在量上可以无限扩展 ...

  8. Unity--关于优化方面的那些事儿(一)

    近期做一个小项目,要求包的大小不能超过30M. 晚上做了个小实验,方法的确非常本,只是曾经非常多没懂的地方如今清晰了很多,我是菜鸟!希望本文章对大家有帮助,谢谢! 实验结果: 实验结果: 1.场景中仅 ...

  9. Replace是替代 Split分割字符串

    Replace是替代 Split分割字符串string[] ReadText = str.Replace("\r\n", "@").Split('@'); Sp ...

  10. Windows Phone 8.1 新功能 - 应用栏控件

    2014年4月3日的微软Build 2014 大会上.Windows Phone 8.1 正式公布. 相较于Windows Phone 8.不论从用户还是开发人员的角度,都产生了非常大的变化. 接下来 ...