1. 转载至:https://www.cnblogs.com/wugu-ren/p/6106379.html

    ViewHolder通常出现在适配器里,为的是listview滚动的时候快速设置值,而不必每次都重新创建很多对象,从而提升性能。
    android开发中Listview是一个很重要的组件,它以列表的形式根据数据的长自适应展示具体内容,用户可以自由的定义listview每一列的布局,但当listview有大量的数据需要加载的时候,会占据大量内存,影响性能,这时候就需要按需填充并重新使用view来减少对象的创建。
    ListView加载数据都是在public View getView(int position, View convertView, ViewGroup parent) {}
    方法中进行的(要自定义listview都需要重写listadapter:如BaseAdapterSimpleAdapter,CursorAdapter的等的getvView方法),优化listview的加载速度就要让convertView匹配列表类型,并最大程度上的重新使用convertView
    getview的加载方法一般有以下三种种方式:
    最慢的加载方式是每一次都重新定义一个View载入布局,再加载数据
  1. 1 public View getView(int position, View convertView, ViewGroup parent)
  2. 2 {
  3. 3 View item = mInflater.inflate(R.layout.list_item_icon_text,
  4. 4 null);
  5. 5 ((TextView)
  6. 6 item.findViewById(R.id.text)).setText(DATA[position]);
  7. 7 ((ImageView) item.findViewById(R.id.icon)).setImageBitmap(
  8. 8 (position & 1) == 1 ? mIcon1 : mIcon2);
  9. 9 return item;
  10. 10 }

正确的加载方式是当convertView不为空的时候直接重新使用convertView从而减少了很多不必要的View的创建,然后加载数据

  1. 1 public View getView(int position, View convertView, ViewGroup parent)
  2. 2 {
  3. 3 if (convertView == null) {
  4. 4 convertView = mInflater.inflate(R.layout.item, parent, false);
  5. 5 }
  6. 6 ((TextView)
  7. 7 convertView.findViewById(R.id.text)).setText(DATA[position]);
  8. 8 ((ImageView)
  9. 9 convertView.findViewById(R.id.icon)).setImageBitmap(
  10. 10 (position & 1) == 1 ? mIcon1 : mIcon2);
  11. 11 return convertView;
  12. 12 }

最快的方式是定义一个ViewHolder,将convetView的tag设置为ViewHolder,不为空时重新使用即可

  1. 1 static class ViewHolder {
  2. 2 TextView text;
  3. 3 ImageView icon;
  4. 4 }
  5. 5 public View getView(int position, View convertView, ViewGroup parent)
  6. 6 {
  7. 7 ViewHolder holder;
  8. 8 if (convertView == null) {
  9. 9 convertView = mInflater.inflate(R.layout.list_item_icon_text,
  10. 10 parent, false);
  11. 11 holder = new ViewHolder();
  12. 12 holder.text = (TextView) convertView.findViewById(R.id.text);
  13. 13 holder.icon = (ImageView) convertView.findViewById(R.id.icon);
  14. 14 convertView.setTag(holder);
  15. 15 } else {
  16. 16 holder = (ViewHolder) convertView.getTag();
  17. 17 }
  18. 18 holder.text.setText(DATA[position]);
  19. 19 holder.icon.setImageBitmap((position & 1) == 1 ? mIcon1 :
  20. 20 mIcon2);
  21. 21 return convertView;
  22. 22 }

Android——ViewHolder的作用与用法的更多相关文章

  1. Android ViewHolder的作用与用法

    就是一个持有者的类,他里面一般没有方法,只有属性,作用就是一个临时的储存器,把你getView方法中每次返回的View存起来,可以下次再用.这样做的好处就是不必每次都到布局文件中去拿到你的View,提 ...

  2. ViewHolder的作用和用法

    一直都看别人用ViewHolder,自己也用过,却不知道它的作用是什么?但知道肯定很有用,而且现在android studio应该有直接生产Viewholder的插件, 不过博主我是个新手,就没尝试去 ...

  3. Android知识——ViewHolder的作用与用法

    ViewHolder通常出现在适配器里,为的是listview滚动的时候快速设置值,而不必每次都重新创建很多对象,从而提升性能.在android开发中Listview是一个很重要的组件,它以列表的形式 ...

  4. Android View.setId(int id) 用法

    Android View.setId(int id) 用法 当要在代码中动态的添加View并且为其设置id时,如果直接用一个int值时,Studio会警告. 经过查询,动态设置id的方法有两种; 1. ...

  5. serialVersionUID, ObjectInputStream与ObjectOutputStream类,Serializable接口,serialVersionUID的作用和用法

    ObjectInputStream与ObjectOutputStream类所读写的对象必须实现Serializable接口,对象中的transient和static类型成员变量不会被读取和写入 Ser ...

  6. Oracle函数over(),rank()over()作用及用法--分区(分组)求和& 不连续/连续排名

    (1)   函数:  over()的作用及用法:    -- 分区(分组)求和. RANK ( ) OVER ( [query_partition_clause] order_by_clause )D ...

  7. Linq中关键字的作用及用法

    Linq中关键字的作用及用法 1.All:确定序列中的所有元素是否都满足条件.如果源序列中的每个元素都通过指定谓词中的测试,或者序列为空,则为 true:否则为 false. Demo: 此示例使用 ...

  8. JSP九大内置对象的作用和用法总结?

    JSP九大内置对象的作用和用法总结? 1.request对象javax.servlet.http.HttpServletRequest request对象代表了客户端的请求信息,主要用于接受通过HTT ...

  9. Android Intent的几种用法全面总结

    Android Intent的几种用法全面总结 Intent, 用法 Intent应该算是Android中特有的东西.你可以在Intent中指定程序要执行的动作(比如:view,edit,dial), ...

随机推荐

  1. mysql从零开始之MySQL 删除数据库

    MySQL 删除数据库 使用普通用户登陆 MySQL 服务器,你可能需要特定的权限来创建或者删除 MySQL 数据库,所以我们这边使用 root 用户登录,root 用户拥有最高权限. 在删除数据库过 ...

  2. Linux从头学15:【页目录和页表】-理论 + 实例 + 图文的最完全、最接地气详解

    作 者:道哥,10+年嵌入式开发老兵,专注于:C/C++.嵌入式.Linux. 关注下方公众号,回复[书籍],获取 Linux.嵌入式领域经典书籍:回复[PDF],获取所有原创文章( PDF 格式). ...

  3. 左手IRR,右手NPV,掌握发家致富道路密码

    智能手机的普及让世界成为了我们指尖下的方寸之地. 在各种信息爆炸出现的同时,五花八门的理财信息与我们的生活越贴越近.投资不再仅仅是企业行为,对于个人而言,也是很值得关注的内容. 但是落脚到很小的例子之 ...

  4. Java基础之(六):变量、运算符与JavaDoc

    变量.常量 一.变量的命名规范 首字母只能以字母(A-Z或者a-z)或者美元符($)或者下划线(_)开头,不能以数字开头,首字母之后只能跟字母(AZ或者az)或者数字,不能跟美元符或者下划线 源码 p ...

  5. FFT 的一些技巧

    三次变两次 FFT 我们发现: \[(F(x)+iG(x))^2=F(x)^2-G(x)^2+2iF(x)G(x) \] 也就是说,我们把 \(F(x)\) 作为实部,\(G(x)\) 作为虚部,那么 ...

  6. GoLang设计模式11 - 备忘录模式

    备忘录模式是一种行为型设计模式.这种模式允许我们保存对象在某些关键节点时的必要信息,以便于在适当的时候可以将之恢复到之前的状态.通常它可以用来帮助设计撤销/恢复操作. 下面是备忘录设计模式的主要角色: ...

  7. Python中的sys.stdin和input、sys.stdout与print--附带讲解剑指offer42-连续子数组的最大和

    2020秋招季,终于开始刷第一套真题了,整套试卷就一道编程题,还是剑指offer上的原题,结果答案死活不对,最后干脆直接提交答案算了,看了下别人的答案,原来是输入数据没有获取的原因,不过这个语法sys ...

  8. TypeError: module() takes at most 2 arguments (3 given)

    1. 错误提示 2. 代码 class Parent: """定义父类""" def __init__(self): print(" ...

  9. Java中的函数式编程(三)lambda表达式

    写在前面 lambda表达式是一个匿名函数.在Java 8中,它和函数式接口一起,共同构建了函数式编程的框架.   lambda表达式乍看像是匿名内部类的一种语法糖,但实际上,它们是两种本质不同的事物 ...

  10. 单机CentOS 安装 TiDB

    目录 一.官网教程 二.安装步骤 1.下载并安装 TiUP: 2.声明一下环境变量,否则会找不到 tiup 命令 3.安装 TiUP 的 cluster 组件: 4.官方教程说,由于模拟多机部署,需要 ...