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. ACM Find them, Catch them

    The police office in Tadu City decides to say ends to the chaos, as launch actions to root up the TW ...

  2. springMVC源码分析--ViewNameMethodReturnValueHandler返回值处理器(三)

    之前两篇博客springMVC源码分析--HandlerMethodReturnValueHandler返回值解析器(一)和springMVC源码分析--HandlerMethodReturnValu ...

  3. Shell脚本了解

    一.什么是Shell Shell 是一个用C语言编写的程序,它是用户使用Linux的桥梁.Shell既是一种命令语言,又是一种程序设计语言. Shell 是指一种应用程序,这个应用程序提供了一个界面, ...

  4. 快速排序quick_sort(python的两种实现方式)

    排序算法有很多,目前最好的是quick_sort:unstable,spatial complexity is nlogN. 快速排序原理 python实现 严蔚敏的 datastruct书中有伪代码 ...

  5. Tomcat如何实现Comet

    Comet模式是一种服务器端推技术,它的核心思想提供一种能让当服务器端往客户端发送数据的方式.Comet模式为什么会出现?刚开始人们在客户端通过不断自动刷新整个页面来更新数据,后来觉得体验不好又使用了 ...

  6. SQL Join各种内联外联说明

    Visual Representation of SQL Joins C.L. Moffatt, 3 Feb 2009 CPOL    4.96 (406 votes) Rate this: This ...

  7. Android N(7.0) 被美翻的新特性!

    Tamic 专注移动开发!更多文章请关注 Csdn: http://blog.csdn.net/sk719887916/article/details/52612444 $ http://www.ji ...

  8. load balancer 配置参考

    https://wiki.ewu.edu/oit/Load_balancing_using_nginx

  9. Java中的泛型类和泛型方法区别和联系

    泛型的概念大家应该都会,不懂的百度或者google,在java中泛型类的定义较为简单 <span style="font-size:18px;"><span st ...

  10. RxJava操作符(02-创建操作)

    转载请标明出处: http://blog.csdn.net/xmxkf/article/details/51645348 本文出自:[openXu的博客] 目录: Create Defer Empty ...