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

下面三段代码实现了三个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也是一种比较通用普遍的方法。

以上。

时间: 2024-10-17 03:14:44

从针对到普遍-Adapter使用的三个阶段的相关文章

针对listview上面的按钮点击事件的操作

最近遇到listView里面装在adapter,而针对每一个adapter的item项进行点击等操作(例如:QQ空间说说列表的点赞.淘宝等一些电商app合并付款购买数量的改变)的问题,里面涉及好数据提交等一系列操作.开始一直没想到好的解决办法,后来偶然看到回调的方式.尝试了一下,终于解决了! 1.在adapter中定义一个接口,在接口中定义一个抽象方法 public interface BuyNumChangedListener {  public abstract void onBuyNumC

Android bluetooth介绍(三): 蓝牙扫描(scan)设备分析

关键词:蓝牙blueZ  A2DP.SINK.sink_connect.sink_disconnect.sink_suspend.sink_resume.sink_is_connected.sink_get_properties.AUDIO.DBUS版本号:基于android4.2之前版本号 bluez内核:linux/linux3.08系统:android/android4.1.3.4作者:xubin341719(欢迎转载.请注明作者.请尊重版权谢谢)欢迎指正错误.共同学习.共同进步!! 參考

Android之ListView性能优化——使用ConvertView和ViewHolder

使用ConvertView和ViewHolder的优化是针对ListView的Adapter(BaseAdapter)的.这种优化的优点如下: 1)重用了ConveertView,在很大程度上减少了内存的消耗.通过判断ConvertView是否为NULL,如果是NULL那么就需要生成一个新的View出来(通过LayoutInflater生成),绑定数据后显示给用户:如果ConvertView不是NULL,则我们需要做的就只有绑定数据并呈现给用户. 2)由于ListView中的Item往往都是只有

闪存阵列可以替代传统SAN

IBM预计,2017年,I/O密集型存储市场的规模大约为70亿美元.IBM今年推出的FlashSystem V840就是专为这一市场打造的.IBM认为,在这一市场上,闪存优化型解决方案有机会替代传统的SAN存储. Gartner的报告显示,到2017年,全球闪存阵列市场收入预计将达到2014年的5倍.闪存阵列市场已成为主流存储系统厂商的必争之地,IBM当然也不例外. 2014年6月,Gartner发布的<2013年全球固态硬盘和闪存阵列市场报告>显示,IBM按营收计算在闪存阵列市场占据25%的

Android开发:ListView、AdapterView、RecyclerView全面解析

目录 AdapterView简介 AdapterView本身是一个抽象类,AdapterView及其子类的继承关系如下图: 特征: AdapterView继承自ViewGroup,本质是个容器 AdapterView可以包含多个"列表项",并将这多个列表项以合适的形式展示 AdapterView显示的列表项内容由Adapter提供 它派生的子类在用法上也基本相似,只是在显示上有一定区别,因此把他们也归为一类. 由AdapterView直接派生的三个类: AbsListView.AbsS

Android之实现ViewPager+Fragment左右滑动

近期看新闻发现新闻的页面是能够左右滑动的.于是自己就好奇起来了,之前做过ViewPager展示图片,在想怎么载入页面呢?研究了一下.发现就是加入了Fragment,废话不多说,揭秘奥秘的时候到了. 使用过ViewPager小伙伴们都知道,Viewpager载入数据.须要数据源,这里我们定义4个Fragment. 为了方便其它同事使用,我给这4个Fragment加入了一个基类.详细代码例如以下: public abstract class BaseFragment extends Fragment

【转】Android bluetooth介绍(三): 蓝牙扫描(scan)设备分析

原文网址:http://blog.csdn.net/xubin341719/article/details/38584469 关键词:蓝牙blueZ  A2DP.SINK.sink_connect.sink_disconnect.sink_suspend.sink_resume.sink_is_connected.sink_get_properties.AUDIO.DBUS版本:基于android4.2之前版本 bluez内核:linux/linux3.08系统:android/android4

Adapter(适配器)模式

1. 概述: 接口的改变,是一个需要程序员们必须(虽然很不情愿)接受和处理的普遍问题.程序提供者们修改他们的代码;系统库被修正;各种程序语言以及相关库的发展和进化.  例子1:iphone4,你即可以使用UBS接口连接电脑来充电,假如只有iphone没有电脑,怎么办呢?苹果提供了iphone电源适配器.可以使用这个电源适配器充电.这个iphone的电源适配器就是类似我们说的适配器模式.(电源适配器就是把电源变成需要的电压,也就是适配器的作用是使得一个东西适合另外一个东西.)  例子2:最典型的例

Android高手进阶——Adapter深入理解与优化

Android高手进阶--Adapter深入理解与优化 通常是针对包括多个元素的View,如ListView,GridView.ExpandableListview,的时候我们是给其设置一个Adapter.Adapter是与View之间提供数据的桥梁,也是提供每一个Item的视图桥梁.   以ListView为例.其工作原理为: ● ListView针对List中每一个item, adapter都会调用一个getView的方法获得布局视图 ●我们通常会Inflate一个新的View,填充数据并返