欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android ListView适配器(Adapter)优化方法详解

程序员文章站 2024-03-01 12:16:52
android listview的优化,在做android项目的时候,在用到listview 界面及数据显示,这个时候如果资源过大,对项目来说,用户体验肯定是不好的,这里就...

android listview的优化,在做android项目的时候,在用到listview 界面及数据显示,这个时候如果资源过大,对项目来说,用户体验肯定是不好的,这里就对如何优化做了详细介绍:

adapter的作用就是listview界面与数据之间的桥梁,当列表里的每一项显示到页面时,都会调用adapter的getview方法返回一个view。想过没有? 在我们的列表有1000000项时会是什么样的?是不是会占用极大的系统资源?

listview的adapter的作用如下图所示:

Android ListView适配器(Adapter)优化方法详解

先看看下面的代码:

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;
}

怎么样?如果超过1000000项时,后果不堪设想!您可千万别这么写!

我们再来看看下面的代码:

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;
}

怎么样,上面的代码是不是好了很多?系统将会减少创建很多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;
}

怎么样?会不会又给您的系统带来很大的提升呢?看看下面三种方式的性能对比图您就知道了!

Android ListView适配器(Adapter)优化方法详解

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!