连接AdapterView视图和数据源的桥梁:Adapter适配器(1)
Adapter适配器体系结构如下图,
图片来源:http://blog.csdn.net/lonelyroamer/article/details/7525834
查阅Android官方文档,Adapter接口的定义
可以知道Adapter是一个借口,它有很多的子类或者子接口(包括间接的子类)。
Adapter在官方文档中的描述:
An Adapter object acts as a bridge between an AdapterView
and the underlying data for that view. The Adapter provides access to the data items. The Adapter is also responsible for making a View
for each item in the data set.
翻译:一个Adapter是AdapterView视图与数据之间的桥梁,Adapter提供对数据的访问,也负责为每一项数据产生一个对应的View。
Adapter的常用子类有ArrayAdapter<T>,SimpleAdapter,BaseAdapter,SimpleCursorAdapter等,其中ArrayAdapter<T>是字符串数组或集合的适配,SimpleAdapter使用在自定义布局的多种数据的适配,BaseAdapter是原生态的适配器是一个抽象类(注:上面第一幅图部分有误),可以定义一个类继承它,来最大程度定义一个自己需要的适配器,SimpleCursorAdapter是数据库SQLite的适配器。
使用Adapter类的步骤分三步:
1.准备数据源,本地或者网络数据均可。
2.创建适配器,即根据不同的情景创建不同的适配器对象。
3.注册适配器,通过new AdapterView().setAdapter(adapter)方法注册,利用Adapter将AdapterView与数据源连接起来,完成数据的适配和显示。
下面主要介绍ArrayAdapter<T>和SimpleAdapter的使用.
1.ArrayAdapter<T>
ArrayAdapter<T>类的定义:
从类的定义可以看出ArrayAdapter<T>是BaseAdapter的子类,其中BaseAdapter是一个抽象类,同时ArrayAdapter<T>实现了Filterable接口,其中Filterable接口声明了一个方法getFilter()。
ArrayAdapter<T>构造方法:
分析:从构造方法可以看出ArrayAdapter中适配的数据是字符串数组或者字符串的集合,这里T是泛型,它可以使任意数据类型,但是它的toString()方法必须是一个字符串,它们的构造方法第一个参数都是一个Context 对象,第二个参数是一个资源Id,整型的resource表示的是展示数据项的布局xml文件Id,其中后两个构造方法中,第三个参数都是一个整型的textViewResourceId,它是对应前面的 resource布局文件中所对应的TextView的id,例如如果你选用的布局文件是系统自带的如android.R.layout.simple_list_item_1布局文件,那么textViewResourceId的值则必须与之对应的这个布局文件中的TextView的id,即android.R.id.text1,其他的参数List<String> objects代表的是适配器适配的是一个字符串集合的数据源,String[] objects代表的是适配器适配的是一个字符串数组的数据源。
总结:创建一个ArrayAdapter<T>适配器的对象,需要三方面内容,一是当前的上下文,二是数据项显示的布局文件,三是数据源。
Java扩展:字符串数组和字符串集合其实可以看作是相通的,或者更进一步来说抽象数组和集合是相通的,也就是抽象数组可以转化为集合,集合也可以转化为抽象数组,使用数组是它的概念更简单,可以很形象的描述事物,而使用集合,是因为它有比数组更多的方法,可以对里面的数据进行各种操作,同时集合也扩展了数组表示的范围,因为集合可以存储各种类型的数据,比数组丰富的多。
数组与集合的相互转换:
public static <T> List<T> Arrays.asList(T.. a);将数组转换为集合
public object[] new List().toArray();将集合转换为数组,其中new List()这里要是List的一个子类对象如ArrayList<T>和LinkedList<T>,toArray()是一个实例方法。
集合可以转换为数组的根本原因是必须是该集合的底层数据结构本身是一个数组,如ArrayList<T>它本身是用数组实现的,LinkedList<T>底层也是链接数组实现的。
细节:观察ArrayAdapter<T>的第一个构造方法,可以看见只有两个参数,没有数据源,那么数据源的设置是怎样添加的呢?
ArrayAdapter<T>提供了下面的三种方法来设置要匹配的数据
从这个特殊的构造方法可以看出适配器的创建的同时不一定要立即绑定数据源,可以随后根据实际的情景在随后来进行数据源的绑定。
特点:从ArrayAdapter<T>的所有构造方法来看,其对应的数据都是单条数据的数组或者集合,也就是说它的显示布局是固定了,其对应的布局文件根节点只能是一个TextView或者类似的控件,即使是自定义的布局文件其根节点也必须是TextView或者类似的控件,可以扩充的只是在自定义布局中显示的多种属性的设置,它的好处也许是可以显示简单的数据,通过它获取入门适配器比较容易。
示例:
或者
或者
2.SimpleAdapter
SimpleAdapter类的定义:
类的定义和ArrayAdapter<T>一样,都是BaseAdapter的子类,同时实现了Filterable接口。不同的是ArrayAdapter<T>适配的单条数据的集合或者数组,而SimpleAdapter适配的类型更丰富,或者说显示的每一个数据项是多种数据的集合。虽然其名字是SimpleAdapter,但是它一点都“Simple”,使用威力巨大,几乎适配各种情景。
其构造方法:
第一个参数:Context context 上下文
第二个参数:List<? extends Map<String,?>> data 数据源,要求是一个List集合,同时集合中的每一个元素是一个Map集合
第三个参数:int resource 自定义的布局XML文件Id
第四个参数:String[] from 一个字符串集合,其中集合中的每一个值是数据源Map集合中需要映射的键的值
第五个参数:int[] to 一个整型集合,其中的每一个元素是布局文件中的显示数据的控件的Id,与第四个参数的每个值是一一对应关系
比较难理解的是第四个参数和第五个参数,这两个参数要结合来看,字符串数组中的每一个值与整型数组的每一个值是一一对应关系,从在界面显示的任意一个数据项来看,字符串数组是要显示的数据的键的集合(数据是采用键值对存取),整型数组展示要显示数据的UI组件的的Id,每个数据项的显示都是将字符串数组中的每一个键所对应的数据取出,放置在与之对应的整型数组中每个元素所对应的UI组件上显示出来。
SimpleAdapter的关键点就在它的构造方法上,且它只有一个构造方法。
示例:
MainActivity源码:
数据项布局文件:
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 android:orientation="horizontal" 6 android:padding="10dp" > 7 8 <ImageView 9 android:id="@+id/image" 10 android:layout_width="80dp" 11 android:layout_height="80dp" 12 android:scaleType="fitXY" /> 13 14 <LinearLayout 15 android:layout_width="match_parent" 16 android:layout_height="80dp" 17 android:orientation="vertical" > 18 19 <TextView 20 android:id="@+id/title" 21 android:layout_width="match_parent" 22 android:layout_height="wrap_content" 23 android:gravity="center" 24 android:textSize="20sp" 25 android:textStyle="bold" /> 26 27 <TextView 28 android:id="@+id/content" 29 android:layout_width="match_parent" 30 android:layout_height="0dp" 31 android:layout_marginLeft="20dp" 32 android:layout_weight="1" 33 android:gravity="center_horizontal" > 34 </TextView> 35 </LinearLayout> 36 37 </LinearLayout>
效果图:
SimpleAdpater是一种使用很广的适配器,特别使用于自定义布局的显示。
未完,待续。