android的ListView入门系列二

listView提供了优化技术

listView每一行显示的内容是可以复用的,因为手机的显示行数是有限的,如果能够实现行的复用,这样就可以大大降低手机资源的浪费,从而提高性能.这个技术就是convertview,它实现的原理如下图:

192621866.png屏幕只显示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);



以上优化的例子和代码参见附件:

本文出自 “安卓” 博客,谢绝转载!

你可能感兴趣的:(listView系列)