码迷,mamicode.com
首页 > 其他好文 > 详细

从针对到普遍-Adapter使用的三个阶段

时间:2015-02-11 21:50:47      阅读:127      评论:0      收藏:0      [点我收藏+]

标签:

下面三段代码实现了三个Adapter,CursorAdapter,BaseAdapter,多类型List的Adapter。

首先是CursorAdapter是针对数据库和Content Provider的一种Adapter(一般使用Content Provider也是使用数据库的操作,因此会返回Cursor)

 1 import android.app.Activity;
 2 import android.content.Context;
 3 import android.database.Cursor;
 4 import android.provider.ContactsContract;
 5 import android.view.View;
 6 import android.view.ViewGroup;
 7 import android.widget.CursorAdapter;
 8 import android.widget.TextView;
 9 
10 public class CustomCursorAdapter extends CursorAdapter {
11 
12     private Context mContext;
13 
14     public CustomCursorAdapter(Context context, Cursor c) {
15         super(context, c, false);
16         mContext=context;
17     }
18 
19     @Override
20     public View newView(Context context, Cursor cursor, ViewGroup parent) {
21         return ((Activity)mContext).getLayoutInflater().inflate(R.layout.cursor_item,parent,false);
22     }
23 
24     @Override
25     public void bindView(View view, Context context, Cursor cursor) {
26         TextView textView=(TextView)view.findViewById(R.id.text);
27         textView.setText(cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)));
28     }
29 }

上述两个Override方法是必须实现的。

 

然后是BaseAdapter的使用方法,这个适合自定义模型的现实,比较灵活,同时也是上述CursorAdapter和多类型显示List Adapter的一个基类,下面代码是一种基本实现

 1 import android.app.Activity;
 2 import android.content.Context;
 3 import android.view.View;
 4 import android.view.ViewGroup;
 5 import android.widget.BaseAdapter;
 6 import android.widget.TextView;
 7 
 8 import java.util.ArrayList;
 9 
10 public class CustomBaseAdapter<T> extends BaseAdapter{
11 
12     private ArrayList<T> mArrayList=new ArrayList<T>();
13     private Context mContext;
14 
15     public CustomBaseAdapter(Context context,ArrayList<T> entries) {
16         mContext=context;
17         mArrayList=entries;
18     }
19 
20     @Override
21     public int getCount() {
22         return mArrayList.size();
23     }
24 
25     @Override
26     public T getItem(int position) {
27         return mArrayList.get(position);
28     }
29 
30     @Override
31     public long getItemId(int position) {
32         return 0;
33     }
34 
35     @Override
36     public View getView(int position, View convertView, ViewGroup parent) {
37         if(convertView==null){
38             convertView=((Activity)mContext).getLayoutInflater().inflate(R.layout.list_item,parent,false);
39         }
40         T entry=getItem(position);
41         TextView textView=(TextView)convertView.findViewById(R.id.text);
42         textView.setText(entry.toString());
43         return convertView;
44     }
45 }

 

最后实现的这个ListView是实现多个类型列表共存的一种Adapter,实际上就是使用判断语句来分别判断实例化哪一种布局实例和填充对象(这就用到了getView返回的View的多态性质)

 1 public class DemoBaseAdapter extends BaseAdapter {
 2 
 3     ArrayList<HashMap<String,Object>> ls=new ArrayList<HashMap<String, Object>>();
 4     Context mContext;
 5     final int VIEW_TYPE=2;
 6     final int TYPE_1=0;
 7     final int TYPE_2=1;
 8 
 9     private TextView text;
10     private LayoutInflater mInflater;
11 
12     public DemoBaseAdapter(Context context,ArrayList<HashMap<String,Object>> ls) {
13         this.ls=ls;
14         mContext = context;
15     }
16 
17     @Override
18     public int getCount() {
19         return 2;
20     }
21 
22     @Override
23     public Object getItem(int position) {
24         return ls.get(position);
25     }
26 
27     @Override
28     public long getItemId(int position) {
29         return 0;
30     }
31 
32     @Override
33     public View getView(int position, View convertView, ViewGroup parent) {
34         int type=getItemViewType(position);
35         if(convertView==null){
36             mInflater= LayoutInflater.from(mContext);
37             switch (type){
38                 case TYPE_1:
39                     convertView=mInflater.inflate(R.layout.item_1, parent, false);
40                     text = (TextView) convertView.findViewById(R.id.text);
41                     break;
42                 case TYPE_2:
43                     convertView=mInflater.inflate(R.layout.item_2, parent, false);
44                     text = (TextView)convertView.findViewById(R.id.text);
45                     break;
46             }
47         }else {
48             switch (type){
49                 case TYPE_1:
50                     text = (TextView)convertView.findViewById(R.id.text);
51                     break;
52                 case TYPE_2:
53                     text = (TextView)convertView.findViewById(R.id.text);
54                     break;
55             }
56         }
57 
58         switch (type){
59             case TYPE_1:
60                 text.setText("Item1");
61                break;
62             case TYPE_2:
63                 text.setText("Item2");
64                 break;
65         }
66         return convertView;
67     }
68 
69     @Override
70     public int getViewTypeCount() {
71         return VIEW_TYPE;
72     }
73 
74     @Override
75     public int getItemViewType(int position) {
76         int type=-1;
77         switch (position){
78             case 0:
79                 type = TYPE_1;
80                 break;
81             case 1:
82                 type = TYPE_2;
83                 break;
84         }
85         return type;
86     }
87 }

上面代码为了不使用模型层数据而在某些数据上作伪了,效果是:

技术分享

 

总结一下,使用BaseAdapter作为基类可以实现比较灵活的布局设置,但是使用Cursor可以结合数据库和LoadCallbacks接口可以实现数据的异步查询和加载。

但是因为CursorAdapter也是从BaseAdapter所派生的,因此,使用BaseAdapter也是一种比较通用普遍的方法。

 

以上。

从针对到普遍-Adapter使用的三个阶段

标签:

原文地址:http://www.cnblogs.com/lhyz/p/4286708.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!