第一种方法

  重用了convertView,很大程度上的减少了内存的消耗。通过判断convertView是否为null,是的话就需要产生一个视图出来,然后给这个视图数据,最后将这个视图返回给底层,呈献给用户。 特点:如果当前的convertView为null,则通过LayoutInflat产生一个view。

 ViewCode
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = LayoutInflater.from(context).inflate(R.layout.section_list_item1,null);
}
TextView tv_name = (TextView)convertView.findViewById(R.id.contact_contactinfoitem_tv_name);
TextView tv_phone = (TextView)convertView.findViewById(R.id.contact_contactinfoitem_tv_phoneNum);
ContactInfo1 confo = contacts.get(position);
if (confo != null) {//to set every item's text
tv_name.setText(confo.getContactName());
tv_phone.setText(confo.getContact_Phone());
}
return convertView;
}

上面的写法会有一个缺点,就是每次在getVIew的时候,都需要重新的findViewById,重新找到控件,然后进行控件的赋值以及事件相应设置。这样其实在做重复的事情,因为的geiview中,其实包含有这些控件,而且这些控件的id还都是一样的,也就是其实只要在view中findViewById一次,后面无需要每次都要findViewById了。

第二种方法

  1. 第二种写法写发的特点,通常有一个内部类classViewHolder,这个ViewHolder,用来标识view中一些控件,方便进行一些事件相应操作的设置,比如onClick等等,这样可以不用每次都要findViewById了,减少了性能的消耗。同时重用了convertView,很大程度上的减少了内存的消耗。

     public View getView (int position, View convertView, ViewGroup parent) {
    ViewHolder holder;
    if (convertView == null) {
    convertView = LayoutInflater.from(context).inflate(R.layout.section_list_item1,null);
    holder = new ViewHolder();
    holder.tv_name = (TextView)convertView.findViewById(R.id.contact_contactinfoitem_tv_name);
    holder.tv_phone = (TextView)convertView.findViewById(R.id.contact_contactinfoitem_tv_phoneNum);
    convertView.setTag(holder);
    } else {
    holder = (ViewHolder)convertView.getTag();
    }
    ContactInfo1 confo = contacts.get(position);
    Log.i("my","confo"+confo.getContactName());
    if (confo != null) {//to set every item's text
    holder.tv_name.setText(confo.getContactName());
    holder.tv_phone.setText(confo.getContact_Phone());
    }
    return convertView;
    }
    classViewHolder
    {
    TextViewtv_name,tv_phone;
    }

    第三种方法

    使用了内部类classViewHolder、重用了convertView。 
    区别第二种写法是,使用了一个临时变量Viewview=convertView,然后修改view,最后返回view 
    复制代码 代码如下:

     @Override
    public View getView(int position,View convertView,ViewGroup parent)
    {
    View view = convertView;
    ViewHolder holder;
    if (view == null) {
    view = LayoutInflater.from(context).inflate(R.layout.section_list_item1,null);
    holder = newViewHolder();
    holder.tv_name = (TextView)view.findViewById(R.id.contact_contactinfoitem_tv_name);
    holder.tv_phone = (TextView)view.findViewById(R.id.contact_contactinfoitem_tv_phoneNum);
    view.setTag(holder);
    } else {
    holder = (ViewHolder)view.getTag();
    }
    ContactInfo confo = contacts.get(position);
    Log.i("my", "confo" + confo.getContactName());
    if (confo != null) {//to set every item's text
    holder.tv_name.setText(confo.getContactName());
    holder.tv_phone.setText(confo.getContact_Phone());
    }
    return view;
    }
    static class ViewHolder {
    TextView tv_name, tv_phone;
    }

    这里设置ViewHolder为static,也就是静态的,静态类只会在第一次加载时会耗费比较长时间,但是后面就可以很好帮助加载,同时保证了内存中只有一个ViewHolder,节省了内存的开销。

Android中ListView的优化的更多相关文章

  1. Android中ListView控件的使用

    Android中ListView控件的使用 ListView展示数据的原理 在Android中,其实ListView就相当于web中的jsp,Adapter是适配器,它就相当于web中的Servlet ...

  2. ym——Android之ListView性能优化

    转载请注明本文出自Cym的博客(http://blog.csdn.net/cym492224103),谢谢支持! Android之ListView性能优化 假设有看过我写过的15k面试题的朋友们一定知 ...

  3. Android中Listview点击item不变颜色以及设置listselector 无效

    Android中Listview点击item不变颜色以及设置listselector 无效 这是同一个问题,Listview中点击item是会变颜色的,因为listview设置了默认的listsele ...

  4. android中ListView控件&&onItemClick事件中获取listView传递的数据

    http://blog.csdn.net/aben_2005/article/details/6592205 本文转载自:android中ListView控件&&onItemClick ...

  5. android中ListView点击和里边按钮点击不能同时生效问题解决

    今天遇到一个问题:android中ListView点击和里边button点击不能同时生效问题解决. 原因是: listView 在开始绘制的时候,系统首先调用getCount()函数,根据他的返回值得 ...

  6. Android中ListView无法点击

    Android中ListView无法点击 转自:http://xqjay19910131-yahoo-cn.iteye.com/blog/1319502   问题描述: ListView中Item加入 ...

  7. Android中ListView的几种常见的优化方法

    Android中的ListView应该算是布局中几种最常用的组件之一了,使用也十分方便,下面将介绍ListView几种比较常见的优化方法: 首先我们给出一个没有任何优化的Listview的Adapte ...

  8. Android中ListView实现图文并列并且自定义分割线(完善仿微信APP)

    昨天的(今天凌晨)的博文<Android中Fragment和ViewPager那点事儿>中,我们通过使用Fragment和ViewPager模仿实现了微信的布局框架.今天我们来通过使用Li ...

  9. Android之ListView性能优化——一行代码绑定数据——万能适配器

    如下图,加入现在有一个这样的需求图,你会怎么做?作为一个初学者,之前我都是直接用SimpleAdapter结合一个Item的布局来实现的,感觉这样实现起来很方便(基本上一行代码就可以实现),而且也没有 ...

随机推荐

  1. Qt中QWidget加入到父类QWidget不能显示的问题

    最近忙活了半天发现了一个不容易发现的问题,比如我有一个父类的自定义Widget,并且自己设置了Pattle,但这个时候我如果再在当前Widget内部加入自己的widget就不能正常显示,但是加QPus ...

  2. JavaScript作用域链详解

    JavaScript的作用域链还是很有味道的,搞懂了这个知识点,闭包的问题也就迎刃而解咯 1.JavaScript的全局变量和局部变量 首先,先来看看js的全局变量和局部变量,js不是块级作用域,所以 ...

  3. angularJS中如何写服务

    服务的用途 服务提供了一种能在应用的整个生命周期内保持数据的方法,它能够在控制器之间进行通信,并且能保证数据的一致性 服务提供了把特定功能相关联的方法集中在一起的接口 如何创建服务 angularJS ...

  4. · HTML使用Viewport

    · HTML使用ViewportViewport可以加速页面的渲染,请使用以下代码<meta name=”viewport” content=”width=device-width, initi ...

  5. PHP引用(&)详解

    PHP的引用(就是变量.函数.对象等前面加上&符号) 在PHP 中引用的意思是:不同的名字访问同一个变量内容. 变量的引用 PHP 的引用允许你用两个变量来指向同一个内容 //打印数组 fun ...

  6. ajax切换明星头像!

    html部分: <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...

  7. codevs 1153 道路游戏

    传送门   题目描述 Description 小新正在玩一个简单的电脑游戏.游戏中有一条环形马路,马路上有n 个机器人工厂,两个相邻机器人工厂之间由一小段马路连接.小新以某个机器人工厂为起点,按顺时针 ...

  8. Web应用指纹识别

    http://danqingdani.blog.163.com/blog/static/186094195201493121834603/

  9. jQuery Builder

    简介 作用:customize jQuery,可以仅包含自己想要的模块 jQuery Builder lets you easily build a custom version of jQuery ...

  10. 帕累托分析法(Pareto Analysis)(柏拉图分析)

    帕累托分析法(Pareto Analysis)(柏拉图分析) ABC分类法是由意大利经济学家帕雷托首创的.1879年,帕累托研究个人收入的分布状态图是地,发现少数人收入占全部人口收入的大部分,而多数人 ...