(转载请注明出处: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. CheckBox和控件Foreach循环

    .aspx代码例如以下: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Sam ...

  2. gwt CellTable中的控件按Tab键切换

    默认是 cellTable.setKeyboardSelectionPolicy(KeyboardSelectionPolicy.ENABLED); 如果要Tab,则设置为DISABLED; 并将其t ...

  3. Hibernate常用Annotation标签说明

    @ javax.persistence.Entity 实体类定义,该标签表示当前类是一个Hibernate的数据库实体,对应着数据库中的某个表 位置:用于类级别 参数:无 样例:@Entity 注意: ...

  4. HDU 1114 Piggy-Bank 全然背包

    Piggy-Bank Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit S ...

  5. Hive综合HBase——经Hive阅读/书写 HBase桌子

    社论: 本文将Hive与HBase整合在一起,使Hive能够读取HBase中的数据,让Hadoop生态系统中最为经常使用的两大框架互相结合.相得益彰. watermark/2/text/aHR0cDo ...

  6. android删除文件出错

    当删除一个文件,再又一次下载这个同名文件,保存到sdcard时出现error,部分手机出现 Caused by: libcore.io.ErrnoException: open failed: EBU ...

  7. Android开发调节屏幕亮度

    在播放器,我们经常看到这样的设计,即,在用户的特定部分将能够滑动屏幕向上或向下调整屏幕的亮度,上下滑动的某一部分将能够调整播放音量.并以滑动的进程可以进行调整,以玩. 如今,我不得不说一下亮度调节. ...

  8. ffplay for mfc 代码备忘录

    在上传一个开源播放器项目ffplay for mfc.它会ffmpeg工程ffplay媒体播放器(ffplay.c)移植到VC环境,而使用MFC做一套接口.它可以完成一个播放器播放的基本流程的视频:解 ...

  9. jspsmart(支持中文下载)

    将excel文件从jsp页面导入到数据库,先将文件上传到server,然后读取,最后删除掉上传//要加encType="multipart/form-data"<form a ...

  10. 用Jstack跟踪Cpu占用率的Java线程(转)

    以下方法在centOS下执行通过:1.先定位占用cpu高的进程 top 2.使用以下命令 ps p 14766 -L -o pcpu,pid,tid,time,tname,stat,psr | sor ...