提高android--listview的优化

来源:互联网 发布:外国人淘宝 编辑:程序博客网 时间:2024/04/28 14:57
Adapter是listview和数据源间的中间人。
 
当每条数据进入可见区域时,adapter的getview()会被调用,返回代表具体数据的视图。触摸滚动时,频繁调用。支持成百上千条数据。
 
下面为显示每条数据的xml文件:
 
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
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的更新不到10frames/second
 
2的更新接近30frames/second
 
3的更新接近40frames/second
 
背景和图像
 
视图背景图像总会填充整个视图区域
 
1。图像尺寸不合适会导致自动缩放
 
2。避免实时缩放
 
3。最好预先缩放到视图大小
 
originalImage = Bitmap.createScaledBitmap(