RecyclerView0基于使用
(转载请注明出处:http://www.kennethyo.me/post/android/recyclerviewchu-ji-shi-yong)
RecyclerView是Android在v7包中包括了一个新的widget。RecyclerView是一个ListView进阶版,但不继承与AdapterView。相比ListView,RecyclerView更加灵活和先进。
1。导入RecyclerView
首先要保证SDK Tools和Android为最新版。
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点击不同位置。有不同的响应。
版权声明:本文博客原创文章。博客,未经同意,不得转载。
RecyclerView0基于使用的更多相关文章
- 最近帮客户实施的基于SQL Server AlwaysOn跨机房切换项目
最近帮客户实施的基于SQL Server AlwaysOn跨机房切换项目 最近一个来自重庆的客户找到走起君,客户的业务是做移动互联网支付,是微信支付收单渠道合作伙伴,数据库里存储的是支付流水和交易流水 ...
- 自定义基于 VLC 的视频播放器
前言(蛋疼的背景故事) 前段时间,接了一个小项目,有个需求是要在系统待机一段时间以后,循环播放 MV(类似于 Windows 系统的屏幕保护). 听到这个需求,我首先想到的是 MediaPlayer ...
- 构建一个基本的前端自动化开发环境 —— 基于 Gulp 的前端集成解决方案(四)
通过前面几节的准备工作,对于 npm / node / gulp 应该已经有了基本的认识,本节主要介绍如何构建一个基本的前端自动化开发环境. 下面将逐步构建一个可以自动编译 sass 文件.压缩 ja ...
- 常用 Gulp 插件汇总 —— 基于 Gulp 的前端集成解决方案(三)
前两篇文章讨论了 Gulp 的安装部署及基本概念,借助于 Gulp 强大的 插件生态 可以完成很多常见的和不常见的任务.本文主要汇总常用的 Gulp 插件及其基本使用,需要读者对 Gulp 有一个基本 ...
- 基于spring注解AOP的异常处理
一.前言 项目刚刚开发的时候,并没有做好充足的准备.开发到一定程度的时候才会想到还有一些问题没有解决.就比如今天我要说的一个问题:异常的处理.写程序的时候一般都会通过try...catch...fin ...
- Spring基于AOP的事务管理
Spring基于AOP的事务管理 事务 事务是一系列动作,这一系列动作综合在一起组成一个完整的工作单元,如果有任何一个动作执行失败,那么事务 ...
- 基于本地存储的kvm虚拟机在线迁移
基于本地存储的kvm虚拟机在线迁移 kvm虚拟机迁移分为4种(1)热迁移基于共享存储(2)热迁移基于本地存储(3)冷迁移基于共享存储(4)冷迁移基于本地存储 这里介绍的是基于本地存储的热迁移 动态块迁 ...
- 使用C#处理基于比特流的数据
使用C#处理基于比特流的数据 0x00 起因 最近需要处理一些基于比特流的数据,计算机处理数据一般都是以byte(8bit)为单位的,使用BinaryReader读取的数据也是如此,即使读取bool型 ...
- ABP教程-打造一个《电话簿项目》-目录-MPA版本-基于ABP1.13版本
此系列文章会进行不定期的更新,应该会有6章左右. 感兴趣的朋友可以跟着看看,本教程适合已经看过ABP的文档但是又无从下手的小伙伴们. 初衷: 发布系列教程的原因是发现ABP在园子火了很久,但是发现还是 ...
随机推荐
- c++进阶
对网络编程/多线程/系统编程有一定了解:4:对ngnix,redis,memcache有一定了解:5:有高并发服务开发经验优先: 因为C/C++在嵌入式.移动互联网.物联网有很大的优势,有很多人就靠一 ...
- 六:Java之集合
集合包括的内容非常多,我发现一个非常好的博客,感觉自己都没有写的必要了! 链接献上 Java集合
- SQL SERVER FOR 多列字符串连接 XML PATH 及 STUFF
原文:SQL SERVER FOR 多列字符串连接 XML PATH 及 STUFF 本来用 Writer 写一篇关于一列多行合并的博客来的,结果快写完了时候,在一个插入代码时候,崩了,重新打开,居然 ...
- TextBox自定义Mac输入框类
using System.Windows.Controls; namespace test { public class MacTextBox : TextBox { private string _ ...
- Git双机同步
如果使用git init 初始化,当客户端仓库push内容时,服务器端仓库可以看到log,但是更新的文件不能显示,必须使用git reset --hard才能更新内容
- SharedPreferences共享优先存储的详细解析和原理
共享优先存储: publicvoid onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setCont ...
- python学习笔记之四:条件,循环和其他语句
前面已经介绍过几种基本语句(print,import,赋值语句),下面我们来介绍条件语句,循环语句. 一. print和import的更多信息 1.1 使用逗号输出 A.打印多个表达式,用逗号隔开,会 ...
- (step7.2.1)hdu 1395(2^x mod n = 1——简单数论)
题目大意:输入一个整数n,输出使2^x mod n = 1成立的最小值K 解题思路:简单数论 1)n可能不能为偶数.因为偶数可不可能模上偶数以后==1. 2)n肯定不可能为1 .因为任何数模上1 == ...
- Oracle安装过程物理内存检查及临时temp空间不足解决办法
物理内存 – 此先决条件将测试系统物理内存总量是否至少为 922MB (944128.0KB). 预期值 : N/A 实际值 : N/A 错误列表: – 可用物理内存 PRVF-7531 : 无法在节 ...
- Python多线程的threading Event
Python threading模块提供Event对象用于线程间通信.它提供了一组.拆除.等待用于线程间通信的其他方法. event它是沟通中最简单的一个过程之中,一个线程产生一个信号,号.Pytho ...