Android进阶笔记10:Android 万能适配器

1. Android 万能适配器

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

(1)首先第一步操作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 }

(2)第二步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 }

(3)第三步使用

 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     public VolTeamAdapter(Context context, List<Bean> listDatas, 15             int layoutId) { 16         super(context, listDatas, layoutId); 17  } 18 
19  @Override 20     protected void fillData(ViewHolder holder, int position) { 21         TextView actNum = holder.getView(R.id.team_item_active_num); 22         TextView time = holder.getView(R.id.team_item_time); 23         TextView title = holder.getView(R.id.team_item_title); 24         CustomImageView icon = holder.getView(R.id.team_item_icon); 25         Beanitem = listDatas.get(position); 26         actNum.setText(String.valueOf(item.getActiveSum()) + "个"); 27         time.setText(String.valueOf(item.getTimeSum()) + "h"); 28  title.setText(item.getName()); 29  BitmapHelper.getInstance(context).display(icon, item.getPhoto()); 30  } 31 
32 }

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

你可能感兴趣的:(Android进阶笔记10:Android 万能适配器)