Android 万能适配器 节省你的开发时间

jopen 8年前

项目中ListView GridView几乎是必用的组件,Android也提供一套机制,为这些控件绑定数据,那就是Adapter。用起来虽然还不错,但每次都需要去继承一个BaseAdapter,然后实现里面的一大堆方法,而我们每次最关心的无非就是getView方法,其余的方法几乎都是相同代码。这里是不是就可以优化起来呢?在其次,我们在使用Adapter的时候,为了优化性能,常常会创建一个Holder。而Holder里面每次存放的都是View,对Holer的操作无非也就是初始化,绑定数据,复用。这里是不是也可以抽取抽取? 好了,废话不多说,直接上代码。

首先第一步操作BaseAdapter公共部分抽取:

import java.util.List;    import android.content.Context;  import android.view.View;  import android.view.ViewGroup;  import android.widget.BaseAdapter;    /**   * 万能适配器   *    * @author Mr.Himan   *    * @param <T>   *            数据源的数据类型   */  public abstract class CommonAdapter<T> extends BaseAdapter {     /**    * 上下文    */   protected Context mContext;   /**    * 数据源    */   protected List<T> listDatas;   /**    * Item布局ID    */   protected int layoutId;     public CommonAdapter(Context context, List<T> listDatas, int layoutId) {    this.mContext = context;    this.listDatas = listDatas;    this.layoutId = layoutId;   }     @Override   public int getCount() {    return listDatas == null ? 0 : listDatas.size();   }     @Override   /**    * 获取当前点击的Item的数据时用    * 在onItemClick中 parent.getAdapter().getItem(),获取当前点击的Item的数据    */   public Object getItem(int position) {    return listDatas.get(position);   }     @Override   public long getItemId(int position) {    return position;   }     @Override   /**    * 只关心这一个方法    */   public View getView(int position, View convertView, ViewGroup parent) {       ViewHolder holder = ViewHolder.getViewHolder(mContext, convertView,      parent, layoutId, position);    fillData(holder, position);    return holder.getMConvertView();   }     /**    *     * 抽象方法,用于子类实现,填充数据    * @param holder    * @param position    */   protected abstract void fillData(ViewHolder holder, int position);    }

第二步Holer的通用化
import android.content.Context;  import android.util.SparseArray;  import android.view.LayoutInflater;  import android.view.View;  import android.view.ViewGroup;    /**   *    * @author Mr.Himan Holer的通用化处理   *    */  public class ViewHolder {      /**    * View容器,用于存放Holer中的View    * 照顾下小白 SparseArray 是Android推荐使用的一个优化容器,相当于一个Map<integer,View>      */   private SparseArray<View> mViews;      /**    * Item布局View convertView    */   private View mConvertView;     public ViewHolder(Context context, ViewGroup parent, int layoutId) {    mViews = new SparseArray<View>();    mConvertView = LayoutInflater.from(context).inflate(layoutId, null);    mConvertView.setTag(this);   }     /**    * 获取ViewHolder    *     * @param context    *            上下文    * @param convertView    * @param parent    * @param layoutId    *            布局layout Id    * @param position    * @return    */   public static ViewHolder getViewHolder(Context context, View convertView,     ViewGroup parent, int layoutId) {      if (convertView == null)     return new ViewHolder(context, parent, layoutId);    return (ViewHolder) convertView.getTag();   }     /**    * 获取Holder中的ItemView    *     * @param viewId    * @return    */   @SuppressWarnings("unchecked")   public <T extends View> T getView(int viewId) {      View item = mViews.get(viewId);    if (item == null) {     item = mConvertView.findViewById(viewId);     mViews.put(viewId, item);    }    return (T) item;   }     /**    * 获取convertView    *     * @return    */   public View getMConvertView() {    return mConvertView;   }  }

第三步使用
package com.css.volunteer.adapter;    import java.util.List;    import android.content.Context;  import android.widget.TextView;    import com.css.volunteer.bean.VolTeamItem;  import com.css.volunteer.bitmap.BitmapHelper;  import com.css.volunteer.manager.R;  import com.css.volunteer.view.CustomImageView;    public class VolTeamAdapter extends CommonAdapter<Bean> {     public VolTeamAdapter(Context context, List<Bean> listDatas,     int layoutId) {    super(context, listDatas, layoutId);   }     @Override   protected void fillData(ViewHolder holder, int position) {    TextView actNum = holder.getView(R.id.team_item_active_num);    TextView time = holder.getView(R.id.team_item_time);    TextView title = holder.getView(R.id.team_item_title);    CustomImageView icon = holder.getView(R.id.team_item_icon);    Beanitem = listDatas.get(position);    actNum.setText(String.valueOf(item.getActiveSum()) + "个");    time.setText(String.valueOf(item.getTimeSum()) + "h");    title.setText(item.getName());    BitmapHelper.getInstance(context).display(icon, item.getPhoto());   }    }


到这里 万事大吉,以后每次写Adaper的时候,无论你的Item布局怎么样,只需要重写一个方法绑定你的数据就OK,能节约不少开发时间



来自: http://blog.csdn.net/soul_code/article/details/50156201