Android学习笔记:ListView优化基本方法
2013-01-22 12:32
471 查看
最近在折腾ListView的优化,发现网上有许多优秀的实现方法,但是分散在不同的代码中,希望通过这一系列文章做个总结,并梳理清楚脉络。
而调用findViewById()方法虽然没有inflate花费那么大,但也属于相对耗时的操作。
下面将讨论如何减少这两种操作使得ListView的性能得到优化。
可见行中被重用。
如果系统判定代表一行的一个视图对象View不再可见时,可以通过getView()方法中的convertView对象重用它。
这样优化过之后的Adapter(getView()方法在Adapter中实现),可以大大减少后期的inflate()方法调用和创建新的View对象。
为了应对前期没有可重用的View的情况,可以通过判断convertView是否为null来决定是否需要调用infalte();
![](http://img.my.csdn.net/uploads/201212/31/1356949889_6978.jpg)
ViewHolder是一个静态内部类,存储了相关视图类的引用,这个引用通过setTag()方法设置标记来指定它对应的视图(ListView布局里的一行)。
如果我们接收到一个convertView对象,可以通过getTag()方法得到ViewHolder实例,然后通过该实例设置视图对象的属性。
这样实现起来比较复杂,但相对每次调用findViewById()方法,能够提高大约15%的速度。
plaincopy
import android.app.Activity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
public class MyPerformanceArrayAdapter extends ArrayAdapter<String> {
private final Activity context;
private final String[] names;
static class ViewHolder {
public TextView text;
public ImageView image;
}
public MyPerformanceArrayAdapter(Activity context, String[] names) {
super(context, R.layout.rowlayout, names);
this.context = context;
this.names = names;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View rowView = convertView;
if (rowView == null) {
LayoutInflater inflater = context.getLayoutInflater();
rowView = inflater.inflate(R.layout.rowlayout, null);
ViewHolder viewHolder = new ViewHolder();
viewHolder.text = (TextView) rowView.findViewById(R.id.TextView01);
viewHolder.image = (ImageView) rowView
.findViewById(R.id.ImageView01);
rowView.setTag(viewHolder);
}
ViewHolder holder = (ViewHolder) rowView.getTag();
String s = names[position];
holder.text.setText(s);
if (s.startsWith("Windows7") || s.startsWith("iPhone")
|| s.startsWith("Solaris")) {
holder.image.setImageResource(R.drawable.no);
} else {
holder.image.setImageResource(R.drawable.ok);
}
return rowView;
}
}
1、大量耗费时间的操作
调用inflate()方法可以从XML文件创建视图对象(如ListView),而这样创建对象是需要大量时间、空间开销的。而调用findViewById()方法虽然没有inflate花费那么大,但也属于相对耗时的操作。
下面将讨论如何减少这两种操作使得ListView的性能得到优化。
2、ConvertView
ListView存储了比所展示行数更多的数据,当用户滚动列表时,某下行和他们对应的View对象将会被滚出可见区域(如下图所示),这些对象可以在新的可见行中被重用。
如果系统判定代表一行的一个视图对象View不再可见时,可以通过getView()方法中的convertView对象重用它。
这样优化过之后的Adapter(getView()方法在Adapter中实现),可以大大减少后期的inflate()方法调用和创建新的View对象。
为了应对前期没有可重用的View的情况,可以通过判断convertView是否为null来决定是否需要调用infalte();
![](http://img.my.csdn.net/uploads/201212/31/1356949889_6978.jpg)
3、Holder模式
ViewHolder模式可以避免减少findViewById()方法的调用,核心也是重用。ViewHolder是一个静态内部类,存储了相关视图类的引用,这个引用通过setTag()方法设置标记来指定它对应的视图(ListView布局里的一行)。
如果我们接收到一个convertView对象,可以通过getTag()方法得到ViewHolder实例,然后通过该实例设置视图对象的属性。
这样实现起来比较复杂,但相对每次调用findViewById()方法,能够提高大约15%的速度。
4、标准Adapter的性能优化
默认的Android Adapter像ArrayAdapter已经实现了性能优化,不需要自己修改实现。5、实例
[java] viewplaincopy
import android.app.Activity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
public class MyPerformanceArrayAdapter extends ArrayAdapter<String> {
private final Activity context;
private final String[] names;
static class ViewHolder {
public TextView text;
public ImageView image;
}
public MyPerformanceArrayAdapter(Activity context, String[] names) {
super(context, R.layout.rowlayout, names);
this.context = context;
this.names = names;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View rowView = convertView;
if (rowView == null) {
LayoutInflater inflater = context.getLayoutInflater();
rowView = inflater.inflate(R.layout.rowlayout, null);
ViewHolder viewHolder = new ViewHolder();
viewHolder.text = (TextView) rowView.findViewById(R.id.TextView01);
viewHolder.image = (ImageView) rowView
.findViewById(R.id.ImageView01);
rowView.setTag(viewHolder);
}
ViewHolder holder = (ViewHolder) rowView.getTag();
String s = names[position];
holder.text.setText(s);
if (s.startsWith("Windows7") || s.startsWith("iPhone")
|| s.startsWith("Solaris")) {
holder.image.setImageResource(R.drawable.no);
} else {
holder.image.setImageResource(R.drawable.ok);
}
return rowView;
}
}
相关文章推荐
- Android学习笔记:ListView优化基本方法
- Android学习笔记:滚动控件ListView的基本使用方法
- Android基本控件之ListView(二)<ListView优化>
- 常用的优化ListView效率的方法及其原理
- Java 程序优化:字符串操作、基本运算方法等优化策略
- Android中Listview的优化方法
- Android中ListView的几种常见的优化方法
- ListView和GridView列表滑动卡顿问题的优化方法汇总
- [Android]ListView的Adapter.getView()方法中延迟加载图片的优化
- Oracle 性能优化的基本方法
- java基本优化方法总结
- 优化 listview 有哪些方法?
- 九大Oracle性能优化基本方法详解
- Mali GPU OpenGL ES 应用性能优化--基本方法
- 安卓重要组件#1--ListView创建及基本的使用方法
- Java 程序优化:字符串操作、基本运算方法等优化策略(二)
- Android中ListView的几种常见的优化方法
- Android学习笔记:ListView优化(深入分析)
- 优化listview的方法
- listview性能优化的方法?