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

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

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

其中MyHolder既是ViewHolder的实现。

所以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了:

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

经测试:在只有一种item的情况下,缓存的ViewHolder的数目为RecyclerView在滑动过程中所能在一屏内容纳的最大item个数+2。比如, 在一个屏幕中只有item A可以显示,在滑动的过程最多可以出现6个item(这个最多是指所有item的个数,包括显示完全和显示不完全的总数),那么ViewHolder的缓 存个数将会是8;

而有至少两种item显示的情况下,每种item的ViewHolder的缓存个数为单种item在一屏内最大显示个数+1;比如,有3 种item A,B,C,在滑动的过程,item A最多的情况下一屏显示了2个,那个item A对应的ViewHolder的缓存个数就是3个。

--转载http://www.cnblogs.com/littlepanpc/p/3859983.html

RecyleView的更多相关文章

  1. recyleView使用笔记

    直接上代码: package com.test.recycleview; import android.app.Activity; import android.graphics.Canvas; im ...

  2. RecyleView 简析

    LayoutManager.Adapter是必须设置的(不设置将无法显示数据---不执行onCreateViewHolder()等方法) ItemDecoration\ItemAnimator是可选的 ...

  3. 【转】GitHub 排名前 100 的安卓、iOS项目简介

    GitHub Android Libraries Top 100 简介 排名完全是根据 GitHub 搜索 Java 语言选择 (Best Match) 得到的结果, 然后过滤了跟 Android 不 ...

  4. GitHub Android Libraries Top 100 简介

    本项目主要对目前 GitHub 上排名前 100 的 Android 开源库进行简单的介绍, 至于排名完全是根据 GitHub 搜索 Java 语言选择 (Best Match) 得到的结果, 然后过 ...

  5. 2016年GitHub 排名前 100 的安卓、iOS项目简介(收藏)

    排名完全是根据 GitHub 搜索 Java 语言选择 (Best Match) 得到的结果, 然后过滤了跟 Android 不相关的项目, 所以排名并不具备任何官方效力, 仅供参考学习, 方便初学者 ...

  6. 64.GitHub 排名前100的android项目简介

    GitHub Android Libraries Top 100 简介 排名完全是根据 GitHub 搜索 Java 语言选择 (Best Match) 得到的结果, 然后过滤了跟 Android 不 ...

  7. Android程序设计-RecyclerView的使用

    [定义] 看到这个标题,也许你会问什么是RecyclerView?其实开始的时候我也不知道- -,下面小编将带领大家领略RecyclerView的强大之处 [描述] 看完这个我想大家应该知道了吧,这个 ...

  8. 100个Github上Android开源库

    项目名称 项目简介 1. react-native 这个是 Facebook 在 React.js Conf 2015 大会上推出的基于 JavaScript 的开源框架 React Native, ...

  9. GitHub上排名前100的Android开源库介绍(来自github)

    本项目主要对目前 GitHub 上排名前 100 的 Android 开源库进行简单的介绍,至于排名完全是根据 GitHub 搜索 Java 语言选择 (Best Match) 得到的结果,然后过滤了 ...

随机推荐

  1. java中|与||,&与&&到底有什么区别呢?

    &是位运算符.&&是布尔逻辑运算符.在运行上,&两边的条件都要判断(不管前面的是ture还是false),而&&先判断前面的,若为false,则后面的不 ...

  2. java5、java6、java7、java8的新特性

    Java5: 1.泛型 Generics:        引用泛型之后,允许指定集合里元素的类型,免去了强制类型转换,并且能在编译时刻进行类型检查的好处. Parameterized Type作为参数 ...

  3. NOI剑客决斗

    http://acm.nyist.net/JudgeOnline/problem.php?pid=110 剑客决斗 时间限制:5000 ms  |  内存限制:65535 KB 难度:5   描述 在 ...

  4. zookeeper系列之七—从远程调用认识zookeeper

    http://www.csdn.net/article/2014-01-02/2817944-zookeeper 在Hadoop的学习过程中,Zookeeper是让很多初学者困惑的技术,远程调用服务是 ...

  5. 统计fastq文件中读段的数量

    mycount=`cat SRR108114_new_1.fastq | wc -l` echo 'Number of clean reads, SRR108114_new_1.fastq: '$(( ...

  6. 【转】Haproxy安装及配置

    1.安装 # wget http://haproxy.1wt.eu/download/1.3/src/haproxy-1.3.20.tar.gz # tar zcvf haproxy-1.3.20.t ...

  7. herf窗口点击跳转

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. Intellij IDEA中使用Struts2

    据说struts2中有很多的漏洞, 不过作为学习我也就用了吧, 因为书上面是按着这个讲的呀. 难怪官网上也没有struts2.2.1的版本的下载. 1. 下载struts2.2.1 ga版本 2. 新 ...

  9. VS连接Windows Mobile模拟器

    原文:http://www.cnblogs.com/xjimmyshcn/archive/2011/07/19/2111087.html 一.WinCE 模拟器通过ActiveSync 6.1(即Wi ...

  10. Protractor AngularJS测试框架教程

    Protractor是一个建立在WebDriverJS基础上的端到端(E2E)的AngularJS JavaScript Web应用程序测试框架.Protractor全自动化真实的模拟用户在真正的浏览 ...