Android 万能适配器 节省你的开发时间
发布时间:2016/1/8 来源:搜数网络 浏览:35

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

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

  1. import java.util.List;  
  2.   
  3. import android.content.Context;  
  4. import android.view.View;  
  5. import android.view.ViewGroup;  
  6. import android.widget.BaseAdapter;  
  7.   
  8. /** 
  9.  * 万能适配器 
  10.  *  
  11.  * @author Mr.Himan 
  12.  *  
  13.  * @param <T> 
  14.  *            数据源的数据类型 
  15.  */  
  16. public abstract class CommonAdapter<T> extends BaseAdapter {  
  17.   
  18.     /** 
  19.      * 上下文 
  20.      */  
  21.     protected Context mContext;  
  22.     /** 
  23.      * 数据源 
  24.      */  
  25.     protected List<T> listDatas;  
  26.     /** 
  27.      * Item布局ID 
  28.      */  
  29.     protected int layoutId;  
  30.   
  31.     public CommonAdapter(Context context, List<T> listDatas, int layoutId) {  
  32.         this.mContext = context;  
  33.         this.listDatas = listDatas;  
  34.         this.layoutId = layoutId;  
  35.     }  
  36.   
  37.     @Override  
  38.     public int getCount() {  
  39.         return listDatas == null ? 0 : listDatas.size();  
  40.     }  
  41.   
  42.     @Override  
  43.     /** 
  44.      * 获取当前点击的Item的数据时用 
  45.      * 在onItemClick中 parent.getAdapter().getItem(),获取当前点击的Item的数据 
  46.      */  
  47.     public Object getItem(int position) {  
  48.         return listDatas.get(position);  
  49.     }  
  50.   
  51.     @Override  
  52.     public long getItemId(int position) {  
  53.         return position;  
  54.     }  
  55.   
  56.     @Override  
  57.     /** 
  58.      * 只关心这一个方法 
  59.      */  
  60.     public View getView(int position, View convertView, ViewGroup parent) {  
  61.         ViewHolder holder = ViewHolder.getViewHolder(mContext, convertView,  
  62.                 parent, layoutId, position);  
  63.         fillData(holder, position);  
  64.         return holder.getMConvertView();  
  65.     }  
  66.   
  67.     /** 
  68.      *  
  69.      * 抽象方法,用于子类实现,填充数据 
  70.      * @param holder 
  71.      * @param position 
  72.      */  
  73.     protected abstract void fillData(ViewHolder holder, int position);  
  74.   
  75. }  

第二步Holer的通用化
  1. import android.content.Context;  
  2. import android.util.SparseArray;  
  3. import android.view.LayoutInflater;  
  4. import android.view.View;  
  5. import android.view.ViewGroup;  
  6.   
  7. /** 
  8.  *  
  9.  * @author Mr.Himan Holer的通用化处理 
  10.  *  
  11.  */  
  12. public class ViewHolder {  
  13.       
  14.     /** 
  15.      * View容器,用于存放Holer中的View 
  16.      * 照顾下小白 SparseArray 是Android推荐使用的一个优化容器,相当于一个Map<integer,View>   
  17.      */  
  18.     private SparseArray<View> mViews;  
  19.       
  20.     /** 
  21.      * Item布局View convertView 
  22.      */  
  23.     private View mConvertView;  
  24.   
  25.     public ViewHolder(Context context, ViewGroup parent, int layoutId) {  
  26.         mViews = new SparseArray<View>();  
  27.         mConvertView = LayoutInflater.from(context).inflate(layoutId, null);  
  28.         mConvertView.setTag(this);  
  29.     }  
  30.   
  31.     /** 
  32.      * 获取ViewHolder 
  33.      *  
  34.      * @param context 
  35.      *            上下文 
  36.      * @param convertView 
  37.      * @param parent 
  38.      * @param layoutId 
  39.      *            布局layout Id 
  40.      * @param position 
  41.      * @return 
  42.      */  
  43.     public static ViewHolder getViewHolder(Context context, View convertView,  
  44.             ViewGroup parent, int layoutId) {  
  45.   
  46.         if (convertView == null)  
  47.             return new ViewHolder(context, parent, layoutId);  
  48.         return (ViewHolder) convertView.getTag();  
  49.     }  
  50.   
  51.     /** 
  52.      * 获取Holder中的ItemView 
  53.      *  
  54.      * @param viewId 
  55.      * @return 
  56.      */  
  57.     @SuppressWarnings("unchecked")  
  58.     public <T extends View> T getView(int viewId) {  
  59.   
  60.         View item = mViews.get(viewId);  
  61.         if (item == null) {  
  62.             item = mConvertView.findViewById(viewId);  
  63.             mViews.put(viewId, item);  
  64.         }  
  65.         return (T) item;  
  66.     }  
  67.   
  68.     /** 
  69.      * 获取convertView 
  70.      *  
  71.      * @return 
  72.      */  
  73.     public View getMConvertView() {  
  74.         return mConvertView;  
  75.     }  
  76. }  

第三步使用
  1. package com.css.volunteer.adapter;  
  2.   
  3. import java.util.List;  
  4.   
  5. import android.content.Context;  
  6. import android.widget.TextView;  
  7.   
  8. import com.css.volunteer.bean.VolTeamItem;  
  9. import com.css.volunteer.bitmap.BitmapHelper;  
  10. import com.css.volunteer.manager.R;  
  11. import com.css.volunteer.view.CustomImageView;  
  12.   
  13. public class VolTeamAdapter extends CommonAdapter<Bean> {  
  14.   
  15.     public VolTeamAdapter(Context context, List<Bean> listDatas,  
  16.             int layoutId) {  
  17.         super(context, listDatas, layoutId);  
  18.     }  
  19.   
  20.     @Override  
  21.     protected void fillData(ViewHolder holder, int position) {  
  22.         TextView actNum = holder.getView(R.id.team_item_active_num);  
  23.         TextView time = holder.getView(R.id.team_item_time);  
  24.         TextView title = holder.getView(R.id.team_item_title);  
  25.         CustomImageView icon = holder.getView(R.id.team_item_icon);  
  26.         Beanitem = listDatas.get(position);  
  27.         actNum.setText(String.valueOf(item.getActiveSum()) + "个");  
  28.         time.setText(String.valueOf(item.getTimeSum()) + "h");  
  29.         title.setText(item.getName());  
  30.         BitmapHelper.getInstance(context).display(icon, item.getPhoto());  
  31.     }  
  32.   
  33. }  


到这里 万事大吉,以后每次写Adaper的时候,无论你的Item布局怎么样,只需要重写一个方法绑定你的数据就OK,能节约不少开发时间
原文地址:http://blog.csdn.net/soul_code/article/details/50156201
返回