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. Cimg代码初探

    Cimg代码初探     程序设计最为激动人心的地方,在于丰富的并且容易被查阅到资料.比如对于图像处理,固然有Opencv等较为丰富.被广泛知晓的类库:也有其他很多具有一定特色的类库.在这段时间里面, ...

  2. UVa 133,发放救济金

    沿用前一个题的思路: 用left记录剩下的点,直到全部选完. 这里我的问题是,我一直pos = (pos + f + n)%n,这里的问题是对于B点来说,开始的位置是1,就成了(1+(-1) +n) ...

  3. Mac环境下用Java(Sikuli+Robot)实现页游自动化

    转载请注明出自天外归云的博客园:http://www.cnblogs.com/LanTianYou/ Sikulix(以前叫Sikuli)在Mac电脑的环境配置步骤如下: 1.从官网上下载Sikuli ...

  4. haha

    [问题描述] 栈是一种强大的数据结构,它的一种特殊功能是对数组进行排序.例如,借助一个栈,依次将数组1,3,2按顺序入栈或出栈,可对其从大到小排序:1入栈:3入栈:3出栈:2入栈:2出:1出栈.在上面 ...

  5. log4net使用(winform)

    有时候 会出现错误 :如 log4net 错误 2 未能找到类型或命名空间名称“log4net”(是否缺少 using 指令或程序集引用?) 解决 方法 :http://q.cnblogs.com/q ...

  6. Jquery实现图片上下一张

    注:调试的时候发现ff下有兼容性问题,把jquery换成4.4版本就没问题了,问题应该在e.offseX上ff不支持此属性,以图片中间宽度为界限,鼠标移动在左边点击跳转到一个链接,鼠标移动右边点击跳转 ...

  7. 修改ftp密码

    1.运行cmd2.在DOS窗口中输入FTP 127.0.0.13.出现用户名输入提示“user”,键入用户名,按回车4.出现输入密码提示:“Password”,键入密码后按回车登录到服务器中5.在ft ...

  8. 嵌入式Linux开发教程:Linux常见命令(上篇)

    摘要:这是对周立功编著的<嵌入式Linux开发教程>的第7期连载.本期刊载内容有关LinuxLinux常见命令中的导航命令.目录命令和文件命令.下一期将连载网络操作命令.安装卸载文件系统等 ...

  9. 关于跨域的ajax

    $.getJSON("http://query.yahooapis.com/v1/public/yql?callback=?", { q: "select * from ...

  10. CodeForces 259A Little Elephant and Chess

     Little Elephant and Chess Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d &am ...