1、概述

ListView是Android中非常常见的控件通过Adapter架起数据与界面显示的桥梁,MVC思想在其中得到了很好地体现:

M:model 数据模型    添加到ListView中显示的数据

V:View   视图 在界面中显示的每一条样式(不只是通常的每一条,比如QQ聊天间隔显示的样式)

C:Control  控制  通过Activity来协调全局

其中的关键所在就是Adapter(适配器),它就是一座桥梁,Adapter提供对数据的访问,也负责为每个数据产生每个对应的View,产生View之后然后将View添加到ListView之中,如何优雅的使用ListView请往下移步

2、ConvertView和ViewHolder

当每条数据进入Adapter时,adapter就要开始调用其 getView(int position, View convertView, ViewGroup parent)方法,以最简单的item为例:每个item仅包含一个图片(imageView)和一行文本(textView)

2.1、最原始的方法(不实用容易导致内存泄露)

非常不推荐这样用,毫不优雅毫无美感!!!

public void getView(int position , View convertView , ViewGroup parent){
        View item = mInflater.inflate(R.layout.list_view, null);
        (TextView)item.findViewById(R.id.text).setText(DATA[position]);
        (ImageView)item.findViewById(R.id.img).setImageBitmap(icon);
        return item;
    }

2.2 使用 ConVertView回收视图(看看就好,小数据量可以使用)

public void getView(int position , View convertView , ViewGroup parent){
        if(convertView == null){
            convertView = mInflater.inflate(R.layout.list_view, null);
        }
      (TextView)convertView.findViewById(R.id.text).setText(DATA[position]);

      (ImageView)convertView.findViewById(R.id.img).setImageBitmap(icon);

         return convertView;
    }

这里提到了“回收”,在Android中提供了一种叫做Recycler(反复循环器)的构件

【原理】就是 当ListView的Item从屏幕上方滚出视线之外后(下图Item1),对应的Item的View会被缓存到Recycler中,相应的会从屏幕下方生成一个新的Item(对应下图的Item8),此时调用的getView中的conView中就是已经被缓存的(item1),不用再创建新的视图上面的代码就是重用了这个convertView改善了listview的性能。

总之,初始时ListView会从Adapter中根据当前的屏幕布局实例化一定数量的view对象,同时ListView会将这些view对象缓存起来。当向上滚动ListView时,原先位于最上面的list item的view对象会被回收,然后被用来构造新出现的最下面的list item。这个构造过程就是由getView()方法完成的,getView()的第二个形参 View convertView就是被缓存起来的list item的view对象(初始化时缓存中没有view对象则convertView是null)。由此可以看出,如果我们不去使用convertView,而是每次都在getView()中重新实例化一个View对象的话,即浪费资源也浪费时间,也会使得内存占用越来越大。

2.3 convertView+ViewHolder(大量数据加载时常用)

先上代码

static class ViewHolder{
        private TextView tv;
        private ImageView iv;
    }

    public void getView(int position , View convertView , ViewGroup parent){
        ViewHolder holder;
        if(convertView == null){
            convertView = mInflater.inflate(R.layout.list_view, null);
            holder = new ViewHolder();
            holder.tv = (TextView)convertView.findViewById(R.id.text);
            holder.iv = (ImageView)convertView.findViewById(R.id.img);
            convertView.setTag(holder);
        }else{
            holder = (ViewHolder) convertView.getTag();
        }
        holder.tv.setText(DATA[position]);
        holder.iv.setImageBitmap(icon);
        return convertView;
    }

这种方式使用到了ViewHolder,其实ViewHolder就是一个很普通的类,类似一个Bean,用来将混存的View封装好,convertView中的SetTag将这些缓存打上对应的标签以供下次直接打包调用,大大提高了速度,特别是在ListView布局多样化时ViewHolder作用就更加明显了。

3、其他

【1】隐藏ListView的滚动条

android:srcollbar=“none”

【2】取消ListView的点击效果

android:listSelector = “#00000000”或者使用android自带的透明效果android:listSelector = “@android:color/transparent”

(不然点击就会出现很难看的黄色背景色。)

【3】设置条目分割线

android:divider="@android:color/darker_gray"

android:dividerHeight = "10dp"

ListView中ConvertView和ViewHolder的更多相关文章

  1. ListView中convertView和ViewHolder的工作原理

    http://blog.csdn.net/bill_ming/article/details/8817172

  2. 关于ListView中convertView的缓存个数的探究

    在面试的时候经常会被问到一个有关ListView的问题:一个ListView的高度最多可以显示5个item,但是却有20条数据要显示,问最多会有多少个convertView会被复用?或者如在ListV ...

  3. Android之ListView性能优化——使用ConvertView和ViewHolder

    使用ConvertView和ViewHolder的优化是针对ListView的Adapter(BaseAdapter)的.这种优化的优点如下: 1)重用了ConveertView,在很大程度上减少了内 ...

  4. 转-ListView的性能优化之convertView和viewHolder

    ListView的性能优化之convertView和viewHolder 2014-05-14 参考:http://www.cnblogs.com/xiaowenji/archive/2010/12/ ...

  5. ListView的性能优化之convertView和viewHolder

    转载请注明出处 最近碰到的面试题中经常会碰到问"ListView的优化"问题.所以就拿自己之前写的微博客户端的程序做下优化. 自己查了些资料,看了别人写的博客,得出结论,ListV ...

  6. ListView性能优化——convertView&viewHolder

    ListView优化大致从以下几个角度:1.复用已经生成的convertView:2.添加viewHolder类:3.缓存数据(图片缓存):4.分页加载. 具体方案: 1.如果自定义适配器,那么在ge ...

  7. Android 如何在 ListView 中更新 ProgressBar 进度

    =======================ListView原理============================== Android 的 ListView 的原理打个简单的比喻就是: 演员演 ...

  8. ListView 中含有 EditText 导致焦点丢失的问题

    ListView 中的 item 中有 EditText 时. 如果activity的输入法选项设置为 android:windowSoftInputMode="adjustResize&q ...

  9. android代码优化----ListView中自定义adapter的封装(ListView的模板写法)

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

随机推荐

  1. C++雾中风景8:Lambda表达式

    上一篇C++的博客是Long Long ago了,前文讲到在看Lambda表达式的内容.笔者首次接触Lambda表达式应该是学习Python语言的时候,当时也不太明白这种表达方式的精髓,后续接触了Sc ...

  2. C++后台实践:古老的CGI与Web开发

    本文写给C/C++程序猿,也适合其他对历史感兴趣的程序猿 ============================================= 谈到web开发,大家首先想到的PHP.JavaEE ...

  3. 重温java基础

    Java标识符 Java所有的组成部分都需要名字.类名.变量名以及方法名都被称为标识符. 关于Java标识符,有以下几点需要注意: 所有的标识符都应该以字母(A-Z或者a-z),美元符($).或者下划 ...

  4. Android监听手机网络变化

    Android监听手机网络变化 手机网络状态发生变化会发送广播,利用广播接收者,监听手机网络变化 效果图 注册广播接收者 <?xml version="1.0" encodi ...

  5. ubuntu垃圾清理命令

    ubuntu的空间莫名不够用了 通过系统自带的工具磁盘使用分析器,发现var文件下面的log100多个g,这个日志文件是可以删除的,然后tmp文件也是可以删除的. 1.sudo rm -rf /tmp ...

  6. Hadoop的RPC通信原理

    RPC调用: RPC(remote procedure call)远程过程调用: 不同java进程间的对象方法的调用. 一方称作服务端(server),一方称为客户端(client): server端 ...

  7. Android Lollipop 5.0 经典新特性回顾

    *Tamic 专注移动开发! 更多文章请关注 http://blog.csdn.net/sk719887916 虽然Android已到了7.0 ,但是我们还是不能忘怀视觉革命性改变的5.0,今天回顾下 ...

  8. ROS机器人程序设计(原书第2版)补充资料 (肆) 第四章 在ROS下使用传感器和执行器

    ROS机器人程序设计(原书第2版)补充资料 (肆) 第四章 在ROS使用传感器和执行器 书中,大部分出现hydro的地方,直接替换为indigo或jade或kinetic,即可在对应版本中使用. 第四 ...

  9. [django1.6]跑批任务错误(2006, 'MySQL server has gone away')

    有个django的定时任务的需求,调用django的orm来对数据库进行数据处理.  在交互环境下直接启动pyhton脚本没有问题,放在定时任务中时候,总是出现 (2006, 'MySQL serve ...

  10. Java进阶(四十六)简述ArrayList、Vector与LinkedList的异同点

    简述ArrayList.Vector与LinkedList的异同点   Collection类的继承图如下:   从图中可以看出,LinkedList与ArrayList.ArrayDeque这三者都 ...