安卓ListView的性能优化
在安卓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:
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的性能优化的更多相关文章
- 转-ListView的性能优化之convertView和viewHolder
ListView的性能优化之convertView和viewHolder 2014-05-14 参考:http://www.cnblogs.com/xiaowenji/archive/2010/12/ ...
- 【Android】以BaseAdapter做适配器的ListView及其性能优化
适配器的Java类 package com.app.adapter; import org.json.JSONArray; import org.json.JSONObject; import and ...
- 安卓中listview中性能优化的处理
1.在adapter中的getView方法中尽量少使用逻辑 不要在你的getView()中写过多的逻辑代码,我们能够将这些代码放在别的地方.比如: 优化前的getView(): @Override p ...
- ListView之性能优化
listview加载的核心是其adapter,本文通过减少adapter中创建.处理view的次数来提高listview加载的性能,总共分四个层次: 0.最原始的加载 1.利用convertView ...
- ListView的性能优化之convertView和viewHolder
转载请注明出处 最近碰到的面试题中经常会碰到问"ListView的优化"问题.所以就拿自己之前写的微博客户端的程序做下优化. 自己查了些资料,看了别人写的博客,得出结论,ListV ...
- ListView的性能优化
@Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder viewHol ...
- Android进阶笔记14:ListView篇之ListView性能优化
1. 首先思考一个问题ListView如何才能提高效率 ? 当convertView为空时候,用setTag()方法为每个View绑定一个存放控件的ViewHolder对象.当convertView不 ...
- ListView性能优化——convertView&viewHolder
ListView优化大致从以下几个角度:1.复用已经生成的convertView:2.添加viewHolder类:3.缓存数据(图片缓存):4.分页加载. 具体方案: 1.如果自定义适配器,那么在ge ...
- Android进阶笔记11:ListView篇之ListView性能优化
1. 首先思考一个问题ListView如何才能提高效率 ? 当convertView为空时候,用setTag()方法为每个View绑定一个存放控件的ViewHolder对象.当convertView不 ...
随机推荐
- switch 循环中的case理解
case后面的常量表达式是程序的入口,一旦找到入口后,后面的其他的case就没有用了,程序就会继续执行后面的所有代码
- 【TensorFlow 官网 可以直接访问】让中国开发者更容易地使用TensorFlow打造人工智能应用
人工智能的神奇之处,在于它能被应用在医疗保健.交通运输和环境保护等方方面面,为复杂的社会问题探寻解决方案.如今,在人工智能的协助下,人们得以探索全新的研究领域,开发创新的产品,让数以百万计的用户从中获 ...
- [坑]Spring利用注解@Value获取properties属性为null
今天在项目中想使用@Value来获取Springboot中properties中属性值. 场景:定义了一个工具类,想要获取一些配置参数,使用了@value来获取,但是死活也获取不到. 如何解决:在使用 ...
- 利用maven打jar包(项目来自GitHub)
1.首先去GitHub上clone一个项目.(前提,maven项目) 2.切换到项目根目录. 3.执行mvn package. 第一次操作失败: 分析错误原因(javac):maven无法找到jdk, ...
- GC其他:引用标记-清除、复制、标记-整理的说明
对象死亡历程 1.基本的mark&sweep是必须的,后续的都是对他的改进, 2.young代理的survivor就是使用了复制算法,避免碎片 3.还有标记整理算法(压缩),就是将存活的对象移 ...
- MySQL的Explain关键字查看是否使用索引
explain显示了MySQL如何使用索引来处理select语句以及连接表.可以帮助选择更好的索引和写出更优化的查询语句.简单讲,它的作用就是分析查询性能. explain关键字的使用方法很简单,就是 ...
- 阻止Enter键回发到服务端Asp.net
//阻止enter键回发到服务端$(function () { $("input[type=text]").each(function () { $(this) ...
- Hive中yyyymmdd和yyyy-mm-dd日期之间的切换
以2017-12-05和20171205相互转换为例说明 方法1: from_unixtime+ unix_timestamp --20171205转成2017-12-05 ','yyyymmdd') ...
- 将Python当作计算器
在交互模式中,最近一个表达式的值赋给变量 _.这样我们就可以把它当作一个桌面计算器,很方便的用于连续计算.例如: >>> price = 1.25 #声明变量price >&g ...
- Vue结合slot插槽分发父组件内容实现高度复用、更加灵活的dialog组件
之前写过一篇关于vue实现dialog会话框组件的文章(http://www.cnblogs.com/fozero/p/8546883.html)[http://www.cnblogs.com/foz ...