这节单独讲AdpaterView类及其子类。
1、AdapterView类继承结构
AdapterView,顾名思义,就是Adapter的View。什么是Adapter呢?我的理解,Adapter就是适配器,
就是将数据保证起来以适配其他类。
对于AdapterView,我们要牢记以下几点:
1、AdapterView继承自ViewGroup,它的本质是容器
2、AdapterView一般包含多个列表项,并将多个列表项以合适的形式呈现出来。
3、AdapterView的每个列表项其实就是Adapter里的一条数据。调用AdapterView类的setAdapter方法
设置Adapter即可。
AdapterView类的继承关系图如下图所示
<图片:AdapterView类的继承关系图>
AdapterView类本身是抽象类,它的三个子类也是抽象类。代表三种风格的列表形式。
2、Adapter类继承结构
Adapter类用来给AdapterView类提供数据,它和各种View类是密切相关的,在分别讲各种具体的AdapterView类之前,
先看一下Adapter类的继承关系
<图片:Adapter类的继承关系>
可以看到,几乎所有的Adapter具体子类都继承自BaseAdapter,BaseAdapter同时实现了ListAdapter和SpinnerAdapter,
可以为AbsListView和AbsSpinnerView提供数据。
常用的实现类有
ArrayAdapter,通常用于将数组和List集合的多个值包装成列表项
SimpleAdapter,通常用于将List集合的多个列表项包装成列表项。注意对象两个字
SimpleCursorAdapter,与SimpleAdapter基本相似,只是用于包装Cursor提供的数据。Cursor字面意思是光标,在Android中
一般引申为数据库中的一行数据。
除了使用上面几个具体类,一般也经常会直接扩展BaseAdapter,通过实现几个方法,可以定义出自己的Adapter类,也很方便。
3、实现ListView的4种方式
第一种,用ArrayAdapter封装数据。ArrayAdapter需要三个参数,
Context:代表当前的Anroid应用
textViewResourceId: 一个资源ID,一般是Layout目录下的一个xml文件,文件里定义了一个TextView组件,代表了列表每一项
的显示外观。也可以使用Android预先定义好的外观,比如传入android.R.layout.simple_list_item_multiple_choice,这样就不用
再去定义一个xml文件了。
第三个参数,数组或List:代表了具体的数据,每个数据对应列表中的一项
第二种,用SimpleAdapter封装数据。和ArrayAdapter类似,不过SimpleAdapter更加强大。
因为ArrayAdapter每个列表项只能是TextView,而SimpleAdapter可以让每一项都包含多种资源。因此它更加复杂,需要5个参数
Context::代表当前Android应用
第二个参数是一个List,而List的每一项都是一个Map<String,?>,即以String为key的一张表。
第三个参数,指定一个界面布局ID,代表每一项数据的显示外观
第四个参数,String[],用于提取第二个参数中每一个Map中的值
第五个参数,int[],用于指定第三个参数中界面布局里哪些ID资源要被填充。
第三种,Activity继承ListActivity,这样的话Acitvity中就无需调用setContentView来设置一个布局文件。相当于它的布局文件中只有一个
ListView。实际上也可以用setContentView来指定一个布局文件,用于替换默认风格。但是注意布局文件中应该包含一个id为
"@+id/android:list"的ListView。
之后同样地,使用ArrrayAdapter封装数据就OK了。
第四种,既不用ArrayAdapter也不用SimpleAdapter,而是自己从BaseAdapter继承一个新的Adapter类,并传给setAdapter。
只需要重写getCount,getItem,getItemId和getView这四个方法就可以了。
4、一些具体的AdapterView类
4.1 ListView
最普遍使用的是ListView,它的用法很简单,基本就是从上往下排列的很多数据项。
前面介绍的添加Adapter的四种方式的时候也涉及到ListView了,不再多讲
4.2 GridView
GridView和ListView最大的区别就是GridView可以是多列的,所以使用GridView最重要的就是android:numColumns属性
其他的属性就是设置拉伸啊之类的,可以用到的时候再看。其余用法比如设置Adpater与ListView是一样的
4.3 ExpandableListView
ExpandableListView就是每项都能展开的ListView,它的外观像这个样子
类似很多聊天软件的好友分组。
很其他组件一样,在布局文件中用起来很简单,就是放一个ExpandableListView组件,设置一下外观属性就OK了。
关键是怎么给它添加Adapter。它的Adapter不能用前面讲的从BaseAdpater继承下来的那些,
而是从BaseExpandableListAdapter继承出来的,继承关系如下
与ListView类似,给ExpandableListView添加Adapter也有以下几种方式
a. 扩展BaseExpandableListAdpater
b. 使用SimpleExpandbleListAdapter将两个List集合包装成ExpandableListAdapter
c. 使用SimpleCursorTreeAdapter将Cursor中的数据包装成SimpleCursorTreeAdapter
扩展BaseExpandableListAdapter最重要的其实就是实现如下4个方法:
getGroupCount():该方法返回包含的组列表项的数量
getGroupView():该方法返回View对象作为组列表项
getChildrenCount():该方法返回特定组所包含的子列表项的数量
getChildView():该方法返回的View对象将作为特定组、特定位置的子列表项
4.4 Spinner
Spinner就是外观类似于这样的东西
指定Adapter也很简单,和ListView类似
4.5 Gallery
Gallery是一个内部元素可以水平滚动,并且可以把当前选择的子元素定位在它中心的布局组件。
外观如下
也没啥特别的,准备好数据项,给它设置Adapter就可以了。
4.6 AdapterViewFlipper
AdapterViewFlipper继承了AdapterViewAnimator,它也会显示Adapter提供的多个View组件。
但它每次只能显示一个View组件,程序可以通过showPrevious()和showNext()方法控制该组件显示上一个和下一个组件。
用起来很简单,给它添加Adapter就好了
4.7 StackView
StackView也是AdapterViewAnimator的子类。它也用于显示Adapter提供的系列View。
不过它会以“堆叠”的方式来显示多个列表项
用法和AdapterViewFlipper一样,设置Adapter然后showPrevious和showNext就可以了。