Android中的适配器的高效写法

Adapter是ListView和数据源之间的中间人:

 

 

当每一条数据进入可见区时:

  Adapter的getView()会被调用;

  返回代表具体数据的视图;

触屏滚动时,频繁调用

支持成百上千条数据

 

显示每一条数据的XML布局文件

<LinearLayout
    xmsns: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_width="0dip"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:layout_weight="1.0" />

</LinearLayout>

 

最简单、最慢、最不实用的方法:

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.findViewById(R.id.icon)).setImageBitmap((pos & 1 ) == 1 ? mIcon1 : mIcon2);
    
    return item;
}

 

利用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.findViewById(R.id.icon)).setImageBitmap((pos & 1 ) == 1 ? mIcon1 : mIcon2);
    
    return convertView;
}

 

使用ViewHolder模式,效率可以再提高50%

ViewHolder类:

static class ViewHolder {
    TextView text;
    ImageView icon;
}

 

使用ViewHolder模式

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.findViewById(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;
}

 

 

文章来自网络

posted on 2013-01-26 22:34  大大森林  阅读(241)  评论(0)    收藏  举报