您的位置:首页 > 移动开发 > Android开发

Make your Android Listview Fast and Efficient

2011-05-27 11:28 267 查看
Make your Android Listview Fast and Efficient
2010-06-21 18:32

Android programming --- Make your Android Listview Fast and Efficient

Google Staff有一篇Turbo-charge your UI关于加速和提高Android UI效率的文章。

把其中关于ListView的部分整理了一下,如下。

1.Globle view

ListView上面关联上需要现实的布局,控件等等。

Adapter建立数据和ListView上面表示控件的关系

DataSource就是存储的数据源,要在ListView表示的数据源

和iPhone中的View, ViewController,等基本上结构还是类似的





2.ListView 和Adpater建立关联和要注意的地方

* 对每一行的数据,对会调用 -- Adapter.getView()来返回要现实的数据。

* 返回一个New的View,系统开销还是比较大的,原文介绍是说Expensive

* 数据量少,还好办,开销也不会太多,如果100万以上呢? 呵呵,这个数据

在Mobile上处理还是有点bt.... 目前测试到的数据10万左右很流程。

3.ListView每行表示的效率问题

不要这么干(Don't): 每次产生ListView的ListItem都会开销一个New View

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

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

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

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

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

return item;

}
可以这么干(Do): 判断试图时候为空,如果已经产生过了,就利用现在的。

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

if (convertView == null) {

convertView = mInflater.inflate(R.layout.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;

}
最好这么做(Even better): 个人理解是做了一个Class,把需要展示的控件列入,加快了Memory clone的效率

static class ViewHolder {

TextView text;

ImageView icon;

}

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;
4.效率如何呢:





比较效果看后,利用ViewHolder后,速度大概有3倍以上的提升
http://leefj.spaces.live.com/blog/cns!ADF54DD0A549AD9B!450.trak
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐