第一版:

  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;
}
}

android: ListView历次优化的更多相关文章

  1. Android listview 的优化

    接[Android listview的应用][1] 在我们上一篇[Android listview的应用][1]中,我们的adapter中的getView()方法中每次都将布局重新加载一遍,这样就会导 ...

  2. Android ListView性能优化实例讲解

    前言: 对于ListView,大家绝对都不会陌生,只要是做过Android开发的人,哪有不用ListView的呢? 只要是用过ListView的人,哪有不关心对它性能优化的呢? 关于如何对ListVi ...

  3. Android Listview 性能优化

    首先我一般使用的适配器是BaseAdapter,其中有两个方法最主要,分别是: getCount,getView, 在对Listview 进行优化的时候,首先使用 convertview 和viewH ...

  4. Android ListView 全面优化

    结合昨天学习的多线程,今天又继续对ListView进行了优化,包括异步加载图片,滑动时暂停加载,滑动停止后再加载显示界面中的item. 综合ListView在使用时参考的多篇博客,这里对ListVie ...

  5. (翻译) Android ListView 性能优化指南

    本文翻译了Lucas Rocha的Performance Tips for Android’s ListView.这是一篇关于介绍如何提升ListView性能的文章,非常的优秀.使得我拜读之后,忍不住 ...

  6. Android ListView的优化

    最近的项目中有通讯录这个模块,里面的通讯录涉及的联系人数量很大,导致在加载页面的时候有点卡,所以就必须得进行优化,优化的最终实现理论是什么?就是让ListView一次性加载的数据较少,后续根据用户操作 ...

  7. android ListView优化

    android ListView通过优化重用历史缓存实现.listview相应的数据适配器一般使用自己定义BaseAdapter子类,重用历史缓冲区来提高性能. 例如,下面的示例代码演示: 1.lis ...

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

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

  9. android ListView的介绍和优化

    xml设计 <?xml version="1.0"?> -<RelativeLayout tools:context=".MainActivity&qu ...

随机推荐

  1. java中23种设计模式

    详情请看23种设计模式

  2. Sybase配置数据库参数

    Sybase配置数据库参数参数配置的两种方法:sp_configure ‘参数名称’,参数值修改参数文件(如:Sybase主机上的 %SYBASE%\servername.cfg) 配置Sybase数 ...

  3. [Manacher][HDU3613][Best Reward]

    题意: 将一段字符串 分割成两个串 如果分割后的串为回文串,则该串的价值为所有字符的权值之和(字符的权值可能为负数),否则为0. 问如何分割,使得两个串权值之和最大 思路: 裸的: 枚举分割点,计算, ...

  4. sshd安全性能优化

    sshd服务是远程登录服务,默认端口为22,对于其优化一是为了增加服务器的安全,避免暴力破解:二是为了加快速度连接,减少不必要的带宽的浪费. sshd服务的配置文件为/etc/ssh/sshd_con ...

  5. margin四个属性的顺序

    margin-top ,margin-right ,margin-bottom ,margin-left .方向为 上右下左,顺时针方向, 值可以是: 百分比(基于父对象总高度或宽度的百分比) 长度值 ...

  6. achartengine andorid图像引擎入门

    最近在帮机械学院开发一个app 用了第三方的图像引擎——achartengine功能还算强大(虽然相比于Html那些第三方图像引擎还是差点不过也够用了) 入门: 参考http://blog.csdn. ...

  7. github Permission denied (publickey)解决办法

    想要玩玩git,参考了网友懒惰之计的一篇Blog<github:如何获取项目源代码 >,按部就班完成了所有的步骤的, 可在测试的时候,遇到了问题,总是报错”github Permissio ...

  8. Codeforces Round #194 (Div. 2) D. Chips

    D. Chips time limit per test:1 second memory limit per test:256 megabytes input:standard input outpu ...

  9. ajax数据显示,使用js通用模板

    最近用ajax获取数据,上级要求要自己写一个js模板,以往看到的js模板,大都数都是在js里面拼接的,现在换一种比较简单的写法, 通过ajax获取数据源,js模板循环显示数据 function Get ...

  10. oracle数据块的大小

    标准数据块用于临时表空间和系统表空间,同时也是一个表空间数据块的默认值.标准数据块的大小是在创建数据库时由参数DB_BLOCK_SIZE确定的.若要改变这一设置必须重建数据库. DB_CACHE_SI ...