android用户界面编程技巧——如何使用Adapter
2011-06-28 11:33
591 查看
2010
-
12
-
21
android用户界面编程技巧——如何使用Adapter
当
我们滑动listview的时候每一条数据进入可见区域的时候adapter的getView方法就会被调用,返回代表具体数据的视图。那么当我们的
listview中有多条数据的时候(一般都是有多条数据的),getView方法就会反复多次的频繁调用。这样的listview就可以显示很多数据,
即成百上千条数据。
显而易见,由于getview方法是频繁调用的我们应该经历的在这个方法中尽可能少的产生对象,最大可能大的提高这个方法的工作效率。这样我们的list的更新速度才不至于太慢。
剖析listview
让
我们来虚拟一个listview
我们假设这个listview的可见区域中有7个listview,当我们用手指向上滑动一个item的时候,第一条数据就离开了可见区域。在
android系统上,为了有效的使用java机制,设立了回收区域。那么离开可见区域的数据就进入了会回收区域,以便于以后再次使用。adpater怎
么会对应的标记这个离开可见区域的数据项,adapter同时会生产第八个视图的数据并显示在可见区域。这个就完了listview的一次更新。
Java代码
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%
Java代码
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静态类:
Java代码
static
class
ViewHolder {
TextView text;
ImageView icon;
}
getview方法代码如下:
Java代码
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;
}
-
12
-
21
android用户界面编程技巧——如何使用Adapter
当我们滑动listview的时候每一条数据进入可见区域的时候adapter的getView方法就会被调用,返回代表具体数据的视图。那么当我们的
listview中有多条数据的时候(一般都是有多条数据的),getView方法就会反复多次的频繁调用。这样的listview就可以显示很多数据,
即成百上千条数据。
显而易见,由于getview方法是频繁调用的我们应该经历的在这个方法中尽可能少的产生对象,最大可能大的提高这个方法的工作效率。这样我们的list的更新速度才不至于太慢。
剖析listview
让
我们来虚拟一个listview
我们假设这个listview的可见区域中有7个listview,当我们用手指向上滑动一个item的时候,第一条数据就离开了可见区域。在
android系统上,为了有效的使用java机制,设立了回收区域。那么离开可见区域的数据就进入了会回收区域,以便于以后再次使用。adpater怎
么会对应的标记这个离开可见区域的数据项,adapter同时会生产第八个视图的数据并显示在可见区域。这个就完了listview的一次更新。
Java代码
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;
}
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%
Java代码
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;
}
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静态类:
Java代码
static
class
ViewHolder {
TextView text;
ImageView icon;
}
static class ViewHolder { TextView text; ImageView icon; }
getview方法代码如下:
Java代码
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;
}
相关文章推荐
- android用户界面编程技巧——如何使用Adapter
- android用户界面编程技巧——如何使用Adapter
- android用户界面编程技巧——如何使用Adapter
- android 如何在JNI编程中使用logCat
- python高效编程技巧11(如何使用多线程)
- Android 用户界面编程技巧和设计模式(性能优化)
- 编程技巧系列(6)如何使用MessageFormat格式化json串
- Android 中 Handler 引起的内存泄露 在Android常用编程中,Handler在进行异步操作并处理返回结果时经常被使用。其实这可能导致内存泄露,代码中哪里可能导致内存泄露,又是如何
- 学习FPGA verilog的心得--编程技巧--如何写代码减少逻辑单元的使用数量
- python高效编程技巧14(如何使用线程池)
- 如何制作一个RSS源,并创建小部件免费使用任何编程技巧
- 在Android操作系统中如何使用Socket编程实现简易聊天室
- 编程技巧:如何使用线程
- android用户界面编程技巧——背景和图像的开发技巧
- android如何在BaseAdapter内使用notifyDataSetChanged()方法以及线程的使用
- Android并发编程之如何使用ReentrantReadWriteLock替代synchronized来提高程序的效率
- Android 编程中,使用静态变量有哪些缺点?应该如何规范使用?
- Android并发编程之如何使用ReentrantReadWriteLock替代synchronized来提高程序的效率
- 关于Android JNI 编程如何定位段错误的问题(addr2line的使用)
- 如何搭建Android的开发环境->在unbuntu 10.04 上使用ubuntu的一些技巧(四)