Android L是android进化史上的里程碑,尽管还没有正式发布4.5或者5.0,但预览版也同样精彩。

这篇文章只是另外一篇博客的总结性翻译,能够读懂原文的,可以点开这个链接去阅读精彩的原文:http://www.javacodegeeks.com/2014/07/android-recyclerview.html。

在android L的预览版中,最新的v7支持包新添加了两个控件:RecyclerView和CardView。这里只对RecyclerView作简要介绍。

RecyclerView是经典的ListView的进化与升华,它比ListView更加灵活,但也因此引入了一定的复杂性。

我们知道,ListView通过使用ViewHolder来提升性能。ViewHolder通过保存item中使用到的控件的引用来减少findViewById的调用,以此使ListView滑动得更加顺畅。但这种模式即使不使用也无妨。

同ListView一样,RecyclerView也需要使用Adapter。Adapter的作用主要是负责一个item中视图的布局以及信息的展示。RecyclerView中的Adapter如下:

 public class MyRecyclerAdapter extends RecyclerView.Adapter<MyRecyclerAdapter.MyHolder> {
....
}

其中MyHolder既是ViewHolder的实现。下面是一个item中布局:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"> <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/txt1"/> <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/txt2"/> </LinearLayout>

所以ViewHolder的实现如下:

 public static class MyHolder extends RecyclerView.ViewHolder {
protected TextView txt1;
protected TextView txt2; private MyHolder(View v) {
super(v);
this.txt1 = (TextView) v.findViewById(R.id.txt1);
this.txt2 = (TextView) v.findViewById(R.id.txt2);
}
}

你可以注意到,findViewById是在ViewHolder的构造函数而非如ListView的getView中调用的。

同时,为了我们的Adapter能够正常的工作,以下的两个方法也必须被实现:

onCreateViewHolder(ViewGroup viewGroup, int i)和onBindViewHolder(MyHolder myHolder, int i)。

在任何ViewHolder被实例化的时候,OnCreateViewHolder将会被触发:

 @Override
public MyHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
numCreated++;
Log.d("RV", "OncreateViewHolder ["+numCreated+"]");
View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.row_layout, null);
MyHolder mh = new MyHolder(v);
return mh;
}

可见,OnCreateViewHolder创建了一个ViewHolder的实例,之后,onBindViewHolder方法则负责将数据与ViewHolder绑定:

 @Override
public void onBindViewHolder(MyHolder myHolder, int i) {
Log.d("RV", "OnBindViewHolder");
Item item = itemList.get(i);
myHolder.txt1.setText(item.name);
myHolder.txt2.setText(item.descr);
}

注意,在这里我们可以直接使用存储在ViewHolder中的控件,而不必再次通过findViewById或者其它什么方法来进行查找。

有了Adapter和数据,我们就可以使用RecyclerView了:

 RecyclerView rv = (RecyclerView) findViewById(R.id.my_recycler_view);
rv.setLayoutManager(new LinearLayoutManager(this));
MyRecyclerAdapter adapter = new MyRecyclerAdapter(createList());
rv.setAdapter(adapter);

如果你进行过测试,你就会通过log发现一个有趣的现象:无论有多少item要显示,被创建的ViewHolder具体的个数为RecyclerView最多能够显示的item个数再加上2。

Android L新控件RecyclerView简介的更多相关文章

  1. android L新控件RecyclerView具体解释DeMo

    简介 在谷歌的官方网站上,我们可以看到,它是此演示文稿:RecyclerView is a more advanced and flexible version of ListView. This w ...

  2. android L新控件RecyclerView详解与DeMo[转]

    http://blog.csdn.net/codebob/article/details/37813801 在谷歌的官网我们可以看到它是这样介绍的: RecyclerView  is a more a ...

  3. android L 新控件侧滑菜单DrawerLayout 使用教程

    介绍 drawerLayout是Support Library包中实现了侧滑菜单效果的控件,可以说drawerLayout是因为第三方控件如MenuDrawer等的出现之后,google借鉴而出现的产 ...

  4. 【转】Android M新控件之FloatingActionButton,TextInputLayout,Snackbar,TabLayout的使用

    Android M新控件之FloatingActionButton,TextInputLayout,Snackbar,TabLayout的使用 分类: Android UI2015-06-15 16: ...

  5. 【转】Android M新控件之AppBarLayout,NavigationView,CoordinatorLayout,CollapsingToolbarLayout的使用

    Android M新控件之AppBarLayout,NavigationView,CoordinatorLayout,CollapsingToolbarLayout的使用 分类: Android UI ...

  6. Android其它新控件 (转)

    原文出处:http://blog.csdn.net/lavor_zl/article/details/51312715 Android其它新控件是指非Android大版本更新时提出的新控件,也非谷歌I ...

  7. android design 新控件

    转载请标明出处: http://blog.csdn.net/forezp/article/details/51873137 本文出自方志朋的博客 最近在研究android 开发的新控件,包括drawe ...

  8. Android新控件RecyclerView剖析

    传智·没羽箭(传智播客北京校区Java学院高级讲师) 个人简单介绍:APKBUS专家之中的一个,黑马技术沙龙会长,在移动领域有多年的实际开发和研究经验.精通HTML5.Oracle.J2EE .Jav ...

  9. [转 载] android 谷歌 新控件(约束控件 )ConstraintLayout 扁平化布局

    序 在Google IO大会中不仅仅带来了Android Studio 2.2预览版,同时带给我们一个依赖约束的库. 简单来说,她是相对布局的升级版本,但是区别与相对布局更加强调约束.何为约束,即控件 ...

随机推荐

  1. 携程Java工程师——一道面向对象面试选择题(转)

    public class Base { private String baseName = "base"; public Base() { callName(); } public ...

  2. Matlab.NET混合编程调用Figure窗体

    原文:[原创]Matlab.NET混合编程调用Figure窗体 1.前言 做Matlab.NET混合编程好几年了,虽然Matlab很多函数忘记得差不多了,但基本的东西还是能熟练使用.特别是在C#调用M ...

  3. poj 1328 Radar Installation (简单的贪心)

    Radar Installation Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 42925   Accepted: 94 ...

  4. android download学习记录

    东西拼凑,最终弄出来能够用的代码 [1].[代码] [Java]代码 跳至 [1] ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 ...

  5. LwIP学习笔记——STM32 ENC28J60移植与入门

    0.前言     去年(2013年)的整理了LwIP相关代码,并在STM32上"裸奔"成功.一直没有时间深入整理,在这里借博文整理总结.LwIP的移植过程细节很多,博文也不可能一一 ...

  6. oracle 数据库备份

    //创建临时表空间create temporary tablespace test_temp tempfile 'D:\oracle\data\test\test_temp.dbf' size 32m ...

  7. 阅读小记3(《C编程专家》)

    gets()不检查缓冲区空间.多余的字符将覆盖原来的栈的内容. fgets()的第二个參数说明最大读入的字符数. 假设这个參数值为n,那么fgets()就会读取最多n-1个字符或读完一个换行符为止.两 ...

  8. hdu 2191 (多重背包+二进制优化)

    Problem Description 急!灾区的食物依然短缺!为了挽救灾区同胞的生命,心系灾区同胞的你准备自己采购一些粮食支援灾区,现在假设你一共有资金n元,而市场有m种大米,每种大米都是袋装产品, ...

  9. clearfix:after 清除css浮动

    在写HTML代码的时候,发现在Firefox等符合W3C标准的浏览器中,如果有一个DIV作为外部容器,内部的DIV如果设置了float样式,则外部的容器DIV因为内部没有clear,导致不能被撑开.看 ...

  10. NYOJ 105 其余9个

    九的余数 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描写叙述 如今给你一个自然数n,它的位数小于等于一百万,如今你要做的就是求出这个数整除九之后的余数. 输入 第一行有一 ...