编写自己的Adapter模板

如果你项目一直用系统给你封装的BaseAdapter的话,那么我只想说,你不累么?
代码繁多还要写数据缓存,还不如自己动手写一个模板吧,这样后面项目就可以直接套用了,编写和执行效率大大提升啊。
BaseAdapter.java

001 import java.util.ArrayList;
002 import java.util.Collection;
003 import java.util.Collections;
004 import java.util.Comparator;
005 import java.util.List;
006  
007 import android.content.Context;
008 import android.content.res.Resources;
009 import android.view.LayoutInflater;
010 import android.view.View;
011 import android.view.ViewGroup;
012  
013  
014 /**
015  * 实现这个适配器模板会少很多代码
016  * @author leehom
017  * @param <T>
018  */
019 public abstract class BaseAdapter<T> extends android.widget.BaseAdapter {
020  
021     protected List<T> list;
022     protected Context context;
023     protected LayoutInflater inflater;
024     private int layoutID;
025  
026     public BaseAdapter(Context context, T[] ts, int layoutID) {
027         super();
028         this.context = context;
029         this.list = new ArrayList<T>();
030         this.layoutID = layoutID;
031         Collections.addAll(list, ts);
032         this.inflater = LayoutInflater.from(context);
033     }
034  
035     public BaseAdapter(Context context, List<T> list, int layoutID) {
036         super();
037         this.layoutID = layoutID;
038         this.context = context;
039         this.list = new ArrayList<T>();
040         this.list.addAll(list);
041         this.inflater = LayoutInflater.from(context);
042     }
043  
044     public Resources getResources() {
045         return context.getResources();
046     }
047  
048     public synchronized void add(T object) {
049         list.add(object);
050     }
051  
052     public synchronized void addAll(Collection<? extends T> collection) {
053         list.addAll(collection);
054     }
055  
056     public synchronized void remove(T object) {
057         list.remove(object);
058     }
059  
060     public synchronized void insert(T object, int index) {
061         list.add(index, object);
062     }
063  
064     public synchronized void clear() {
065         list.clear();
066     }
067  
068     public synchronized void sort(Comparator<? super T> comparator) {
069         Collections.sort(list, comparator);
070     }
071  
072     @Override
073     public T getItem(int position) {
074         // TODO Auto-generated method stub
075         return list.get(position);
076     }
077  
078     @Override
079     public int getCount() {
080         // TODO Auto-generated method stub
081         return list.size();
082     }
083  
084     @Override
085     public long getItemId(int position) {
086         // TODO Auto-generated method stub
087         return position;
088     }
089  
090     @Override
091     public View getView(int position, View convertView, ViewGroup parent) {
092         // TODO Auto-generated method stub
093         ViewHolder holder = null;
094         if (convertView == null) {
095             convertView = inflater.inflate(layoutID, null);
096             holder = new ViewHolder(convertView);
097             initView(holder);
098             convertView.setTag(holder);
099         } else {
100             holder = (ViewHolder) convertView.getTag();
101         }
102         setViewValue(holder, position);
103         return convertView;
104     }
105  
106     public List<T> getList() {
107         return list;
108     }
109      
110     /**
111      * 向ViewHolder类里面添加View
112      * @param holder
113      */
114     public abstract void initView(ViewHolder holder);
115  
116     /**
117      * 从ViewHolder获取对应ID的View设置其值
118      * @param holder
119      * @param t 数据对象
120      */
121     public abstract void setViewValue(ViewHolder holder, int position);
122  
123 }

用的时候也是继承它,然后只需要初始化ID和设置Value就行了。例:

01 import java.lang.reflect.Field;
02 import java.lang.reflect.InvocationTargetException;
03 import java.lang.reflect.Method;
04 import java.util.ArrayList;
05  
06 import android.annotation.SuppressLint;
07 import android.content.Context;
08  
09 import com.fenjin.app.humiture.R;
10 import com.fenjin.app.item.DefaultItem;
11  
12 @SuppressLint("DefaultLocale")
13 public class DefaultAdapter extends BaseAdapter<DefaultItem> {
14  
15     public DefaultAdapter(Context context, Object object) {
16         super(context, new ArrayList<DefaultItem>(),
17                 R.layout.default_list_item_layout);
18         // TODO Auto-generated constructor stub
19         try {
20             Field[] fields = object.getClass().getDeclaredFields();
21             for (Field field : fields) {
22                 String lable = field.getName();
23                 String firstWord = lable.substring(0, 1).toUpperCase();
24                 StringBuffer buffer = new StringBuffer("get");
25                 buffer.append(firstWord);
26                 buffer.append(lable.substring(1));
27                 String name = buffer.toString();
28                 Method method = object.getClass().getDeclaredMethod(name);
29                 String value = method.invoke(object).toString();
30                 DefaultItem item = new DefaultItem(lable, value);
31                 add(item);
32             }
33         } catch (IllegalArgumentException e) {
34             // TODO Auto-generated catch block
35             e.printStackTrace();
36         } catch (NoSuchMethodException e) {
37             // TODO Auto-generated catch block
38             e.printStackTrace();
39         } catch (IllegalAccessException e) {
40             // TODO Auto-generated catch block
41             e.printStackTrace();
42         } catch (InvocationTargetException e) {
43             // TODO Auto-generated catch block
44             e.printStackTrace();
45         }
46     }
47  
48     @Override
49     public void initView(ViewHolder holder) {
50         // TODO Auto-generated method stub
51         holder.addView(R.id.default_lable);
52         holder.addView(R.id.default_value);
53     }
54  
55     @Override
56     public void setViewValue(ViewHolder holder, int position) {
57         // TODO Auto-generated method stub
58         DefaultItem item = getItem(position);
59         holder.getTextView(R.id.default_lable).setText(item.getLable());
60         holder.getTextView(R.id.default_value).setText(item.getValue());
61     }
62  
63     @Override
64     public boolean isEnabled(int position) {
65         // TODO Auto-generated method stub
66         return false;
67     }
68  
69 }

javabean代码

01 public class DefaultItem {
02  
03     String lable;
04     String value;
05  
06     public DefaultItem(String lable, String value) {
07         super();
08         this.lable = lable;
09         this.value = value;
10     }
11  
12     public String getLable() {
13         return lable;
14     }
15  
16     public void setLable(String lable) {
17         this.lable = lable;
18     }
19  
20     public String getValue() {
21         return value;
22     }
23  
24     public void setValue(String value) {
25         this.value = value;
26     }
27  
28 }

xml代码

01 <?xml version="1.0" encoding="utf-8"?>
02 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
03     android:layout_width="match_parent"
04     android:layout_height="match_parent"
05     android:orientation="horizontal"
06     android:padding="@dimen/margin_10" >
07  
08     <TextView
09         android:id="@+id/default_lable"
10         android:layout_width="wrap_content"
11         android:layout_height="wrap_content" />
12  
13     <TextView
14         android:layout_width="wrap_content"
15         android:layout_height="wrap_content"
16         android:text=":" />
17  
18     <TextView
19         android:id="@+id/default_value"
20         android:layout_width="wrap_content"
21         android:layout_height="wrap_content" />
22  
23 </LinearLayout>

每次实现的代码仅仅这么点

01 @Override
02 public void initView(ViewHolder holder) {
03     // TODO Auto-generated method stub
04     holder.addView(R.id.default_lable);
05     holder.addView(R.id.default_value);
06 }
07  
08 @Override
09 public void setViewValue(ViewHolder holder, int position) {
10     // TODO Auto-generated method stub
11     DefaultItem item = getItem(position);
12     holder.getTextView(R.id.default_lable).setText(item.getLable());
13     holder.getTextView(R.id.default_value).setText(item.getValue());
14 }

是不是非常不错呢?

猜你喜欢

转载自lexsain.iteye.com/blog/2189739
今日推荐