我的位置: 首页 > 学习专区 > 安卓技术 > android中listview的优化

android中listview的优化

2012-02-22 11:32:00
来源:
[导读] Adapter的作用是界面与数据之间的桥梁,通过设置适配器至ListView控件后(如调用ListView的 setAdapter(ListAdapter adapter)),列表的每
Adapter的作用是界面与数据之间的桥梁,通过设置适配器至ListView控件后(如调用ListView的 setAdapter(ListAdapter adapter)

),列表的每一项会显示至页面中。其实,当列表里的每一项显示到页面时,都会调用Adapter的getView方法返回一个View,如:

@Override

public View getView(int position, View convertView, ViewGroup parent) {

return super.getView(position, convertView, parent);

}

我们看一看下面的这段代码:

public View getView(int position, View convertView, ViewGroup parent) {

View newView = mInflater.inflate(R.layout.list_item, null);

((TextView) newView .findViewById(R.id.text)).setText(DATA[position]);

((ImageView) newView .findViewById(R.id.icon)).setImageBitmap(

(position & 1) == 1 ? mIcon1 : mIcon2);

return newView ;

}

上面的代码块中,我通过LayoutInflater.inflate(,)将Layout文件–layout.list_item转换为View.

(注:Layout也是View的子类,但在android中如果想将xml中的Layout转换为View放入.java代码中操作,只能通过Inflater,而不能通过findViewById())

这时,如果我的ITEM项有数以千条这样多或更多呢,再以上面代码块的写法,后果自己想想吧。

于是,改用其它一种写法:

public View getView(int position, View convertView, ViewGroup parent) {

if (convertView == null) {

convertView = mInflater.inflate(R.layout.list_item, null);

}

((TextView) convertView.findViewById(R.id.text)).setText(DATA[position]);

((ImageView) convertView.findViewById(R.id.icon)).setImageBitmap(

(position & 1) == 1 ? mIcon1 : mIcon2);

return convertView;

}

这时,上面的代码是不是好了很多?系统将会减少创建很多View。性能得到了很大的提升。

到这里,问一下,还有没有优化的方法呢,是有的,请看————》》:

public View getView(int position, View convertView, ViewGroup parent) {

ViewHolder holder;

if (convertView == null) {

convertView = mInflater.inflate(R.layout.list_item_icon_text, null);

holder = new ViewHolder();

holder.text = (TextView) convertView.findViewById(R.id.text);

holder.icon = (ImageView) convertView.findViewById(R.id.icon);

convertView.setTag(holder);

} else {

holder = (ViewHolder) convertView.getTag();

}

holder.text.setText(DATA[position]);

holder.icon.setImageBitmap((position & 1) == 1 ? mIcon1 : mIcon2);

return convertView;

}

static class ViewHolder {

TextView text;

ImageView icon;

}

这样系统性能会得到更大的提升。

希望可能帮助到大家。这也是平时面试当中面试官经常会问到的”ListView的优化”的问题。

大家都关注:
评论
热点专题
>>