listView提供了优化技术
listView每一行显示的内容是可以复用的,因为手机的显示行数是有限的,如果能够实现行的复用,这样就可以大大降低手机资源的浪费,从而提高性能.这个技术就是convertview,它实现的原理如下图:
屏幕只显示7个item,item1去填充了convertView,把item8的内容加到ListView的底部,并没有产生更多的行数.从已经显示的行里面重复的利用,只是数据是新的.实现的代码如下:
listview优化技巧:
1、contextview 行布局复用
public View getView(int position, View convertView, ViewGroup parent)
{
LayoutInflater layoutInflater = getLayoutInflater();
RelativeLayout layout = null;
if(convertView == null)
{
layout = (RelativeLayout) layoutInflater.inflate(R.layout.rela_item, null);
}
else
{
layout = (RelativeLayout) convertView;
}
return layout;
}
2、减少查找次数
a、声明一个类,用来保存查找到的控件对象
class ViewHolder
{
ImageView imageView;
TextView title;
TextView subTitle;
}
b、找创建行布局对象的同时,创建一个ViewHolder对象,然后查找行布局对象里面的控件
并保存到ViewHolder对象里面。
c、把ViewHolder对象存放到行布局对象的包里面
d、在复用行布局对象的时候,从它里面获取ViewHolder对象,继续使用。
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater layoutInflater = getLayoutInflater();
RelativeLayout layout = null;
ViewHolder holder = null;//声明一个ViewHolder对象
if(convertView == null)
{
layout = (RelativeLayout) layoutInflater.inflate(R.layout.rela_item, null);
holder = new ViewHolder();//创建一个ViewHolder对象
//查找layout里面的对象,并保存到ViewHolder对象里面
holder.imageView = (ImageView) layout.findViewById(R.id.imageView1);
holder.title = (TextView) layout.findViewById(R.id.textView1);
holder.subTitle = (TextView) layout.findViewById(R.id.textView2);
//把ViewHolder对象存放到layout的包里面
layout.setTag(holder);
}
else
{ //复用layout对象
layout = (RelativeLayout) convertView;
//从layout对象里面得到ViewHolder对象
holder = (ViewHolder) layout.getTag();
}
//更改ViewHolder对象保存的控件对象的值
holder.imageView.setImageResource(image[position]);
holder.title.setText(mTitle.get(position));
holder.subTitle.setText(mSubTitle.get(position));
Log.e("getView", "position:" + position + " layout" + layout );
return layout;
}
3、数据封装(便于管理数据)
a、声明一个类,用来保存每一行的数据。
class Dataecapen
{
int imag;
String title;
String subTitle;
public Dataecapen(int imag, String title, String subTitle) {
super();
this.imag = imag;
this.title = title;
this.subTitle = subTitle;
}
}
b、创建这个类对象,把每一行的各个数据保存在对象里面。
c、声明一个数组容器保存这个数据对象。(容器要声明成成员变量)
//为数组容器添加数据
Dataecapen dataecapen = new Dataecapen(image[i], "title" + i, "subTitle" + i);
arrayList.add(dataecapen);
d、在适配器的getview()里面,取获取对应行的数据对象。
获取数据对象里面的详细数据并设置到控件上面。
//从数组容器里面获取对应行的数据对象
Dataecapen dataecapen = arrayList.get(position);
holder.imageView.setImageResource(dataecapen.imag);
holder.title.setText(dataecapen.title);
holder.subTitle.setText(dataecapen.subTitle);
以上优化的例子和代码参见附件:
本文出自 “安卓” 博客,谢绝转载!