博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
安卓ListView的性能优化
阅读量:5831 次
发布时间:2019-06-18

本文共 3858 字,大约阅读时间需要 12 分钟。

在安卓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的实例,只需要重用既可,即直接返回该实例。代码如下:
	@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)); } } } }); } holder.nameView.setText(getChild(groupPosition, childPosition) .toString()); holder.feelView.setText("爱生活...爱Android..."); return convertView; }
这个版本就是最终优化的代码,即重用converView,使用内部类ViewHolder,开启子线程异步处理图片资源。

转载于:https://www.cnblogs.com/hainange/p/6334060.html

你可能感兴趣的文章
郝娜 - 百度百科
查看>>
SmartProg2 Universal, ISP capable programmer
查看>>
jquery常用方法
查看>>
把长方形的图片截取成正方形
查看>>
三大线性排序之基数排序
查看>>
PHP 友好的dump
查看>>
HDU 3473 Minimum Sum(划分树)
查看>>
vs2010设置
查看>>
Android--UI之ViewStub
查看>>
web.xml中contextConfigLocation的作用
查看>>
Storm-源码分析-Topology Submit-Executor-mk-threads
查看>>
我院同学在2013年第四届“蓝桥杯”全国软件专业人才设计与创业大赛全国总决赛中获得佳绩...
查看>>
oracle建立用户与授权(转载)
查看>>
程序猿应该了解的内容以及程序猿如何强迫自己学习(算法篇)
查看>>
获取相对目标元素的鼠标位置
查看>>
下载的firebug-lite压缩包的调用方法
查看>>
精选30道Java笔试题解答
查看>>
深入理解计算机系统(3.5)---特殊的算术操作指令详解
查看>>
析构函数-复制构造函数-赋值操作符重载-默认构造函数<代码解析>
查看>>
android 中 viewpager 滑动的指示器
查看>>