WEB开发网
开发学院手机开发Android 开发 android用户界面编程技巧——如何使用Adapter 阅读

android用户界面编程技巧——如何使用Adapter

 2011-01-11 08:48:43 来源:WEB开发网   
核心提示:最简单的方法:public View getView(int pos, View convertView,ViewGroup parent){View item = mInflater.inflate(R.layout.list_item, null);((TextView) item.findViewById(R.i

最简单的方法:

public View getView(int pos, View convertView,ViewGroup parent){
	View item = mInflater.inflate(R.layout.list_item, null);
	((TextView) item.findViewById(R.id.text)).setText(DATA[pos]);
	((ImageView) item.findViewButId(R.id.icon)).setImageBitmap((pos & 1) == 1 ? mIcon1 : mIcon2);
	return item;
}

inflate方法每次调用getview方法的时候都会调用,但是我们发现 每一个view都是同样的操作。最主要的是,正如我们前面所说当,一个item视图从可见区域被滑动到不可见区域之后,它会进入会区域,但我们再次让这个item进入可见区域的时候我们完全没有必须有再次调用 inflate方法来展开视图,所以这个部分,我们可以利用converView来做一个判断,当converView是null时,也就是回收区域中么有我们要显示的视图的时候我们才去调用inflate方法展开视图布局。这样我们就可以对代码进行简单有效的优化。

利用convertView回收视图, 效率提高 200%

public View getView(int pos, View convertView,ViewGroup parent){
	if (convertView == null) {
		convertView = mInflater.inflate(R.layout.list_item, null);
	}
	((TextView) convertView.findViewById(R.id.text)).setText(DATA[pos]);
	((ImageView) convertView.findViewButId(R.id.icon)).setImageBitmap((pos & 1) == 1 ? mIcon1 : mIcon2);
	return convertView;
} 

相同,我们会发现findviewbyid这里的计划代码也是每次都要调用,我们是不是可以有一个什么方法,让这些操作也像前面的一样回收起来呢。这个时候我们考虑使用viewholder模式。我们首先写一个静态的类,将每一个item的子视图,一个图片视图和一个文本视图缓存或者说是回收在这个静态类中,这样我们就可以节省一些执行findviewbyid方法的时间。这样我们又一次可以优化代码。

利用ViewHolder模式,效率再次调高50%

ViewHolder静态类:

static class ViewHolder {
	TextView text;
	ImageView icon;
}

getview方法代码如下:

public View getView(int pos, View convertView, ViewGroup parent){
	ViewHolder holder;
	if (convertView == null) {
		convertView = mInflater.inflate(R.layout.list_item, null);
		holder = new ViewHolder();
		holder.text = (TextView) convertView.findViewById(R.id.text));
		holder.icon = (ImageView) convertView.findViewButId(R.id.icon));
		convertView.setTag(holder);
	} else {
		holder = (ViewHolder) convertView.getTag();
	}
	holder.text.setText(DATA[pos]);
	holder.icon.setImageBitmap((pos & 1) == 1 ? mIcon1 : mIcon2);
	return convertView;
}

最后呢,这位工程师对这三种方式进行了一个更新数据的比较,用一般的方法每秒更新8个frame,采用回收机制的方法是每秒27个frame,采用ViewHolder模式方法每秒36个frame。

更新效率比较图:

最后,着这次演讲中一个设计了5个模块的编程技巧,如下:

Adapter的使用

图像和背景

更新请求

视图和布局

内存分配

后续我会陆续将其他部分在这里发布,再次申明这些方法是09年google开发者大会分享的,我不知道为什么这些方法按理来说应该早为我们中国开发者所熟知,可是我在很多社区中看多有很多朋友还在找出找这些问题的答案。因此我再次将这些技巧整理发布出来,希望更多的朋友在使用搜索引擎的时候可以找到这些技巧。

上一页  1 2 

Tags:android 用户界面 Adapter

编辑录入:coldstar [复制链接] [打 印]
赞助商链接