ListView历次优化

第一版:

  ListView一屏显示多少对象其内部就创建多少View对象。滑动时退出的缓存对象留给滑进去时调用getView传的convertView。因为如果每次都findViewById查找创建视图对象,浪费性能和内存。所以我们都利用布局创建View给convertView。布局内部的view对象都事先通过findViewById查找好存到某一个集合对象-ViewHolder:视图持有者上。并把这个ViewHolder对象放到convertView的Tag上,通过getView返回给Adapter。下一屏时这个缓存的View对象就会被传进来,此时convertView的Tag属性中有包含了ViewHoler对象-convertView布局内部的对象。这样我们直接用ViewHoler中的对象进行处理了。
下面就是这个版本通用使用方法:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHoler holer;
    if (convertView == null) {
            //convertView = View.inflate(mActivity, R.layout.list_**, null);
            holer = new ViewHoler();
            holer.iv_New_Image = (ImageView) convertView.findViewById(R.id.iv_New_Image);
            holer.tv_Content = (TextView) convertView.findViewById(R.id.tv_Content);
            holer.tv_Date = (TextView) convertView.findViewById(R.id.tv_Date);

            convertView.setTag(holer);
    } else {
            holer = (ViewHoler) convertView.getTag();
    }
    //自行填写完整
    return convertView;
}

class ViewHoler {
        public ImageView iv_New_Image;
        public TextView tv_Content;
        public TextView tv_Date;
}

因为本人懒惰,所以这种findViewById太麻烦了,所以我自己写了个工具。根据自动生成代码。 自定生成ViewHoler代码(当前页面只播放一次,再次查看ctrl+f5一下)。工具下载链接:http://pan.baidu.com/s/1i4tXwvr

第二个版本:
该版本只是对第一个版本上的设计上的改变,将与ViewHoler相关的代码集中到了ViewHoler身上。getView职责更加明确,逻辑也更加清晰。

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHoler holer;
    if (convertView == null) {
            //convertView = View.inflate(mActivity, R.layout.list_**, null);
            holer = new ViewHoler();
    } else {
            holer = (ViewHoler) convertView.getTag();
    }
    //自行填写完整
    return convertView;
}

class ViewHoler {
        public ImageView iv_New_Image;
        public TextView tv_Content;
        public TextView tv_Date;
        public ViewHoler(View convertView){
            this.iv_New_Image = (ImageView) convertView.findViewById(R.id.iv_New_Image);
            this.tv_Content = (TextView) convertView.findViewById(R.id.tv_Content);
            this.tv_Date = (TextView) convertView.findViewById(R.id.tv_Date);
            convertView.setTag(this);
        }
}

工具已经在这个版本上更新了 http://pan.baidu.com/s/1bnVNbPl

第三个版本:
这个版本与前面的版本本质不同,前面都是静态代码。这个ViewHoler中想根据资源Id来获取View。而我们的View存在内部的一个HashMap中,因为HashMap对于查找的时间复杂度是O(1)的,并且因为是KeyValue不担心重复。返回View类型改为泛型是的获取对象时上层不需要强转。

//用法
ViewHolerHelper helper=new ViewHolerHelper(convertView);
ImageView view=helper.getView(R.id.iv_New_Image);

public class ViewHolerHelper {
    private HashMap<Integer,View> mViews;
    View convertView;
    public ViewHolerHelper(View convertView){
        mViews=new HashMap<Integer, View>();
        convertView.setTag(this);
        this.convertView=convertView;
    }
    public <T> T getView(Integer R_Id){
        View view=null;
        if(!mViews.containsKey(R_Id)){
            view=convertView.findViewById(R_Id);
            if(view!=null){
                mViews.put(R_Id, view);
            }
        }
        else{
            view=mViews.get(R_Id);
        }
        return (T)view;
    }
}

时间: 2024-10-13 23:52:45

ListView历次优化的相关文章

Android ListView性能优化实战方案

前言: 对于ListView,大家绝对都不会陌生,只要是做过Android开发的人,哪有不用ListView的呢? 只要是用过ListView的人,哪有不关心对它性能优化的呢? 关于如何对ListView进行性能优化,不仅是面试中常常会被问到的(我前段时间面试了几家公司,全部都问到了这个问题了),而且在实际项目中更是非常重要的一环,它甚至在某种程度上决定了用户是否喜欢接受你的APP.(如果你的列表滑起来很卡,我敢说很多人会直接卸载) 网上关于如何对ListView进行性能优化,提出了很多方案.但

ListView 性能优化------使用ViewHolder,修改layout_weight属性为“match_parent”

转载自:http://blog.csdn.net/pkxiuluo01/article/details/7380860 Adapter是ListView界面与数据之间的桥梁,当列表里的每一项显示到页面时,都会调用Adapter的getView方法返回一个View.如果列表中有很多的项时会占用极大的系统资源,所以我们需要优化Adapter 1.convertView的使用 [java] view plaincopy Java代码 public View getView(int position, 

Android ListView使用BaseAdapter与ListView的优化 (转至 http://www.open-open.com/lib/view/open1339485728006.html)

在ListView的使用中,有时候还需要在里面加入按钮等控件,实现单独的操作.也就是说,这个ListView不再只是展示数据,也不仅仅是这一行要来处理用户的操作,而是里面的控件要获得用户的焦点.读者可以试试用SimpleAdapter添加一个按钮到ListView的条目中,会发现可以添加,但是却无法获得焦点,点击操作被ListView的Item所覆盖.这时候最方便的方法就是使用灵活的适配器BaseAdapter了. ▲图4-35 BaseAdapter中的方法 使用BaseAdapter必须写一

Android ListView使用BaseAdapter与ListView的优化

在ListView的使用中,有时候还需要在里面加入按钮等控件,实现单独的操作.也就是说,这个ListView不再只是展示数据,也不仅仅是这一行要来处理用户的操作,而是里面的控件要获得用户的焦点.读者可以试试用SimpleAdapter添加一个按钮到ListView的条目中,会发现可以添加,但是却无法获得焦点,点击操作被ListView的Item所覆盖.这时候最方便的方法就是使用灵活的适配器BaseAdapter了. ▲图4-35 BaseAdapter中的方法 使用BaseAdapter必须写一

ListView 的优化和优化原理

列表的显示需要三个元素: ListVeiw:  用来展示列表的View. 适配器 : 用来把数据映射到ListView上 数据:    具体的将被映射的字符串,图片,或者基本组件.             根据列表的适配器类型,列表分为三种,ArrayAdapter,SimpleAdapter和SimpleCursorAdapter,这三种适配器的使用大家可学习下官网上面的使用或者自行百度谷歌,一堆DEMO!!!其中以ArrayAdapter最为简单,只能展示一行字.SimpleAdapter有

Android ListView 的优化

一.复用convertView,降低findViewById的次数 1.优化一:复用convertView Android系统本身为我们考虑了ListView的优化问题.在复写的Adapter的类中,比較重要的两个方法是getCount()和getView().界面上有多少个条显示.就会调用多少次的getView()方法:因此假设在每次调用的时候,假设不进行优化.每次都会使用View.inflate(-.)的方法,都要将xml文件解析,并显示到界面上,这是很消耗资源的:由于有新的内容产生就会有旧

ListView常用优化技巧(Android群英传)

内容是博主照着书敲出来的,博主码字挺辛苦的,转载请注明出处,后序内容陆续会码出. 前言:ListView--列表,它作为一个非常重要的显示方式,不管是在Web中还是移动平台中,都是一个非常好的.不开或缺的展示信息的工具.在Android中,ListView控件接管了这一重担,在大量的场合下,我们都需要使用这个控件.虽然在Android 5.X时代,RecyclerView在很多地方都在逐渐取代ListView,但ListView的使用范围依然非常的广泛,它这万年老大哥的地位也不是轻易就能撼动的.

Android Listview 性能优化

首先我一般使用的适配器是BaseAdapter,其中有两个方法最主要,分别是: getCount,getView, 在对Listview 进行优化的时候,首先使用 convertview 和viewHolder 配合进行优化,使用convertview的母的是 控件复用,从而加到减少内存的使用,使用viewHolder 的是减少findbyid 的次数. 但是在进行控件以后,在进行图片加载的时候,会出现图片错位的问题,这是因为控件里面有上次残留的图片在里面,所以我们在初始化的时候需要设置一张默认

Android之ListView性能优化——万能适配器

如下图,加入现在有一个这样的需求图,你会怎么做?作为一个初学者,之前我都是直接用SimpleAdapter结合一个Item的布局来实现的,感觉这样实现起来很方便(基本上一行代码就可以实现),而且也没有觉得有什么不好的.直到最近在慕课网上看到鸿洋大神讲的“机器人小慕”和“万能适配器”两节课,才对BaseAdapter有所了解.看了鸿洋大神的课程之后,我又上网搜了几个博客,也看了一些源码和文档,于是打算写一个帖子来记录一下自己的学习历程. 在今天的帖子中,我们从一个最基本的实现BaseAdapter