Android进阶笔记09: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,能节约不少开发时间。

posted on 2016-01-12 20:53  鸿钧老祖  阅读(235)  评论(0编辑  收藏  举报

导航