在安卓APP中LIstView这个控件可以说基本上是个APP就会用到,但是关于ListView除了需要了解其最基本的用法外,作为一个要做出高性能APP的程序员还需了解一些关于LIstView控件性能优化的基本知识,下面我通过代码一步一步优化的过程来让大家了解LIstView性能优化的相关知识。

一.重用converView:使用LIstView那么你肯定会重写Adapter类中的getView()方法,该方法定义如下:

public View getChildView(int groupPosition, int childPosition,
boolean isLastChild, View convertView, ViewGroup parent) {}

注意在该方法的第四个参数为converView,通过重用该参数,可以大幅度降低内存消耗,通过判断convertView是否为null来判断是否是第一次加载布局,如果为null则代表是第一次加载该该item,需要重新创建一个,如果不为空,则代表内存中存在该view的实例,只需要重用既可,即直接返回该实例。代码如下:

<pre name="code" class="html">	@Override
public View getChildView(int groupPosition, int childPosition,
boolean isLastChild, View convertView, ViewGroup parent) {
GroupHolder holder = null;
if (convertView == null) {
convertView = LayoutInflater.from(mContext).inflate(
R.layout.fragment_constact_child, null);
holder = new GroupHolder();
convertView.setTag(holder);
} else {
holder = (GroupHolder) convertView.getTag();
}
return convertView;
}

这样就能够达到重用convertView的效果。

二.使用viewHolder:

上述方式虽然可以重用converView,但是每次都得通过findViewById()来找到布局视图中的控件id,然后来操作这些控件,其实这些操作都是重复的,我们可以定义一个内部类来管理这些控件,然后通过创建该内部类的实例,即可通过该内部类的实例来进行操作这些控件,这样就不用每次都findViewById(),可以减少内存消耗。代码如下:
class GroupHolder {//定义一个内部类来管理该布局视图中需要用到的控件
TextView nameView;
TextView feelView;
ImageView iconView;
}
@Override
public View getChildView(int groupPosition, int childPosition,
boolean isLastChild, View convertView, ViewGroup parent) {
GroupHolder holder = null;
if (convertView == null) {
convertView = LayoutInflater.from(mContext).inflate(
R.layout.fragment_constact_child, null);
holder = new GroupHolder();
holder.nameView = (TextView) convertView
.findViewById(R.id.contact_list_item_name);
holder.feelView = (TextView) convertView
.findViewById(R.id.cpntact_list_item_state);
holder.iconView = (ImageView) convertView.findViewById(R.id.icon);
convertView.setTag(holder);
} else {
holder = (GroupHolder) convertView.getTag();
}
holder.nameView.setText(getChild(groupPosition, childPosition)
.toString());
holder.feelView.setText("爱生活...爱Android...");
return convertView;
}

三 其它方面:这个主要是如果ListView的布局视图中用到了图片资源时,需要对图片进行处理再加载,具体可以参看我的博客:安卓图片缓存技术,同时请注意使用子线程异步加载,因为图片的加载可能需要消耗一定的时间开销。代码如下;

@Override
public View getChildView(int groupPosition, int childPosition,
boolean isLastChild, View convertView, ViewGroup parent) {
GroupHolder holder = null;
if (convertView == null) {
convertView = LayoutInflater.from(mContext).inflate(
R.layout.fragment_constact_child, null);
holder = new GroupHolder();
holder.nameView = (TextView) convertView
.findViewById(R.id.contact_list_item_name);
holder.feelView = (TextView) convertView
.findViewById(R.id.cpntact_list_item_state);
holder.iconView = (ImageView) convertView.findViewById(R.id.icon);
convertView.setTag(holder);
} else {
holder = (GroupHolder) convertView.getTag();
} String path = childPath[groupPosition][childPosition];
if (hashMaps.containsKey(path)) {
holder.iconView.setImageBitmap(hashMaps.get(path).get());
// 另一个地方缓存释放资源
ImgUtil.getInstance().reomoveCache(path);
} else {
holder.iconView.setTag(path);
//使用自定义的ImgUtil工具类来异步加载图片资源
ImgUtil.getInstance().loadBitmap(path, new OnLoadBitmapListener() {
@Override
public void loadImage(Bitmap bitmap, String path) {
ImageView iv = (ImageView) mIphoneTreeView
.findViewWithTag(path);
if (bitmap != null && iv != null) {
bitmap = SystemMethod.toRoundCorner(bitmap, 15);
iv.setImageBitmap(bitmap); if (!hashMaps.containsKey(path)) {
hashMaps.put(path,
new SoftReference<Bitmap>(bitmap));
}
}
}
}); }
holder.nameView.setText(getChild(groupPosition, childPosition)
.toString());
holder.feelView.setText("爱生活...爱Android...");
return convertView;
}

这个版本就是最终优化的代码,即重用converView,使用内部类ViewHolder,开启子线程异步处理图片资源。


安卓ListView的性能优化的更多相关文章

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

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

  2. 【Android】以BaseAdapter做适配器的ListView及其性能优化

    适配器的Java类 package com.app.adapter; import org.json.JSONArray; import org.json.JSONObject; import and ...

  3. 安卓中listview中性能优化的处理

    1.在adapter中的getView方法中尽量少使用逻辑 不要在你的getView()中写过多的逻辑代码,我们能够将这些代码放在别的地方.比如: 优化前的getView(): @Override p ...

  4. ListView之性能优化

    listview加载的核心是其adapter,本文通过减少adapter中创建.处理view的次数来提高listview加载的性能,总共分四个层次: 0.最原始的加载 1.利用convertView ...

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

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

  6. ListView的性能优化

    @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder viewHol ...

  7. Android进阶笔记14:ListView篇之ListView性能优化

    1. 首先思考一个问题ListView如何才能提高效率 ? 当convertView为空时候,用setTag()方法为每个View绑定一个存放控件的ViewHolder对象.当convertView不 ...

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

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

  9. Android进阶笔记11:ListView篇之ListView性能优化

    1. 首先思考一个问题ListView如何才能提高效率 ? 当convertView为空时候,用setTag()方法为每个View绑定一个存放控件的ViewHolder对象.当convertView不 ...

随机推荐

  1. mac电脑操作

    1.在mac电脑上打开多个终端: command+n快捷键可以打开多个终端  

  2. Python作业之工资管理

    作业之工资管理 工资管理实现要求: 工资管理系统 Alex 100000 Rain 80000 Egon 50000 Yuan 30000 -----以上是info.txt文件----- 实现效果: ...

  3. Windows上安装scapy

    1. 环境: (1) 操作系统:win7 .server2012 (2) Python版本:Python3.6-64bit (3) 依赖模块Npcap(推荐) 或WinPcap.   ps:从logo ...

  4. Android编译安装失败解决办法

    今天用AndroidStudio开发了一个手机App玩玩,但是偶然遇到一个问题,自己手机上测试得劲的很,分享给朋友做测试,但是nie,意外出现了.... 两个人都给我说个安装失败,这个就比较尴尬了,找 ...

  5. CMD远程连接服务器上的MySQL

    1.打开CMD命令行. 2.输入mysql -h要远程的IP地址 -u设置的MySQL用户名 -p登录用户密码 例如:mysql -h192.168.0.110 -uroot -p1233 (如果不能 ...

  6. Python小代码_5_二维矩阵转置

    使用列表推导式实现二维矩阵转置 matrix = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]] print(matrix) matrix_t = [[ro ...

  7. 单页应用动态设置页面title

    1.适用场景:所有通过router路由的单页应用. 2.示例代码:本文以vue-router为例. 在router.js中: let router = new Router({ routes: [ { ...

  8. CentOS Linux上安装Oracle11g笔记

    CentOS Linux上安装Oracle11g 到 otn.oracle.com 网站上下载 Linux版的oracle 11g 编辑 /etc/sysctl.conf : kernel.shmal ...

  9. C++笔记001:Microsoft Visual Studio 2010软件的安装与建立第一个cpp文件

    原创笔记,转载请注明出处! 点击[关注],关注也是一种美德~ 我学习C++使用软件为Microsoft Visual Studio 2010. 首先,软件的安装包 链接:https://pan.bai ...

  10. Go 语言范围(Range)

    Go 语言中 range 关键字用于for循环中迭代数组(array).切片(slice).链表(channel)或集合(map)的元素.在数组和切片中它返回元素的索引值,在集合中返回 key-val ...