[转]技巧和设计模式 --- Adapter实用技巧

 如何使用Adapter

 

Adapter是ListView和数据源之间的中间人,有如下的特点:

 

[1] 当每条数据进入可见区时,Adapter的getView()会被调用,然后返回代表具体数据的视图

 

[2] 触摸滚动时,频繁调用

 

[3] 支持成百上千条数据

 

装载数据视图比较:

 

Adapter显示的每条数据的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实用技巧