提高android应用的效率--主要讲解listview的优化

本文介绍Android中ListView的Adapter优化方法,包括直接inflate布局、利用convertView回收视图及使用ViewHolder模式等三种方式,并对比了它们的性能表现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文地址:http://www.cnblogs.com/error404/archive/2011/08/03/2126682.html

Adapter是listview和数据源间的中间人。
当每条数据进入可见区域时,adapter的getview()会被调用,返回代表具体数据的视图。触摸滚动时,频繁调用。支持成百上千条数据。
下面为显示每条数据的xml文件:
<LinearLayout
android:orientation= "horizontal" >
<ImageView android:id= "@+id/icon"
android:layout_width= "48dip"
android:layout_height= "48dip" />
<TextView android:id= "@+id/text"
android:layout_gravity= "center_vertical"
android:layout_width= "0dip"
android:layout_weight= "1.0"
android:layout_height= "wrap_content" />
</LinearLayout>
1 。最简单的方法,最慢且最不实用
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;
}
2 。利用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;
}
3 。利用viewholder模式,效率在提高 50 %
static class ViewHolder {
TextView text;
ImageView icon;
}
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;
}
adapter更新效率比较:
1 的更新不到 10 frames/second
2 的更新接近 30 frames/second
3 的更新接近 40 frames/second
背景和图像
视图背景图像总会填充整个视图区域
1 。图像尺寸不合适会导致自动缩放
2 。避免实时缩放
3 。最好预先缩放到视图大小
originalImage = Bitmap.createScaledBitmap(
originalImage, //
<!-- Baidu Button BEGIN -->
更多
<!-- Baidu Button END --> <!--192.168.100.34-->
上一篇: android - Gesture学习 -GestureOverlayView 下一篇: android 开发代码 杂七杂八
<!-- Baidu Button BEGIN --> <script type="text/javascript" id="bdshare_js" data="type=tools&amp;uid=1536434"></script><script type="text/javascript" id="bdshell_js"></script><script type="text/javascript"> document.getElementById("bdshell_js").src = "http://bdimg.share.baidu.com/static/js/shell_v2.js?cdnversion=" + Math.ceil(new Date()/3600000) </script><!-- Baidu Button END -->
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值