Android开发自学札记(Android Studio)—4.4 AdapterView及其子类
一、引言
AdapterView本身是一个抽象类,而它派生的子类在用法上也基本相似,只是在显示上有一定区别,因此把他们也归为一类。
AdapterView具有如下特征:
- AdapterView继承自ViewGroup,本质是个容器
- AdapterView可以包含多个“列表项”,并将这多个列表项以合适的形式展示。
- AdapterView显示的多个列表项的内容由Adapter提供
AdapterView及其子类的继承关系如下图所示:
由于Gallery是一个过时的API,Android推荐使用HorizontalScrollView来替代,所以我也不再对它进行学习。
而由AdapterView直接派生的三个类:AbsListView、AbsSpinner、AdapterViewAnimator也都是抽象类,所以我们用的最多的也就是图中第四行及以下的子类。
二、ListView
ListView就是我们所说的列表视图,也是我们最常用的一个组件,它是以垂直列表的形式展示所有数据项,而生成列表视图的方式主要有两种:
- 直接用ListView进行创建
- 让Activity继承ListActivity
而一旦获取到ListView后,对数据的填充就是由Adapter提供内容了,通常使用setAdapter方法。
ListView、GridView、Spinner等AdapterView都只是容器,而Apdater负责提供容器的内容。
AdapterView则负责采用合适的方式显示Adapter提供的内容。
AbsListView的常用属性和相关方法见下表:
属性 | 相关方法 | 说明 |
android:choiceMode | 设置AbsListView的选择方式: singleChoice:允许单选 multipleChoice:允许多选 multipleChoiceModal:允许多选 | |
android:drawSelectorOnTop | setDrawSelectorOnTop(boolean) | 如果该属性设置为true,选中的列表项将会显示在上面 |
android:fastScrollEnabled | 设置是否允许快速滚动。如果该属性设置为true,将会显示滚动图标,并允许用户拖动该滚动图标进行快速滚动。 | |
android:listSelector | setSelector(int) | 指定被选中的列表项上绘制的Drawable |
android:scrollingCache | 如果设置为true,则在滚动时将会使用缓存 | |
android:smoothScrollbar | setSmoothScrollbarEnabled(boolean) | 如果设置为false,则不在header View之后绘制分隔条 |
android:stackFromBottom | 设置是否从底端开始排列列表项 | |
android:textFilterEnabled | 设置是否对列表项进行过滤。只有当该AdapterView对应的Adapter实现了Filter接口时该属性才会作用。 | |
android:transcriptMode | 设置组件的滚动模式: disabled:关闭滚动(默认) normal:当该AbsListView收到数据改变通知,且最后一个列表项可见时,该AbsListView将会滚动到底端。 alwaysScroll:该AbsListView总会自动滚动到底端 |
ListView提供的属性如下表:
属性 | 说明 |
android:divider | 设置List列表项的分隔条(可用颜色分隔,也可用drawable对象分隔) |
android:dividerHeiht | 设置分隔条的高度 |
android:entries | 指定一个数组资源,Android将根据该数组资源来生成ListView |
android:footerDividerEnabled | 如果设置成false,则不在footer View之前绘制分隔条 |
andorid:headerDividerEnabled | 如果设置成false,则不再header View之前绘制分隔条 |
示例代码及显示效果图如下:
示例布局中只定义了一个ListView,并通过android:entries指定了数据源,通过android:divider指定了红色的分隔条。
数据源位于value/arrays.xml中,代码如下:
使用数组作为数据源十分简单,但是局限性也很大,能定制的内容也非常少,甚至字号大小,颜色都不能改变。
如果想对ListView的外观、行为进行定制,就需要把ListView作为AdapterView使用,通过Adapter控制列表项的显示和交互。
三、Adapter接口及其实现类
Adapter本身是一个接口,它派生了ListAdapter和SpinnerAdapter两个子接口,其中ListAdapter为AbsAdapter提供列表项,而SpinnerAdapter为AbsSpinner提供列表项。Adapter及其实现类的继承关系如下图所示:
其中ArrayAdapter、SimpleAdapter、SimpleCursorAdapter、BaseAdapter都是常用的实现类。
1.ArrayAdapter:简单、易用的Adapter,通常用于将数组或者List集合的多个值包装为列表项的数据源
2.SimpleAdapter:功能强大的Adapter,可用于将List集合的多个对象包装为列表项的数据源
3.SimpleCursorAdapter:与SimpleAdapter类似,只是用于包装Cursor提供的数据
4.BaseAdapter:通用用于被扩展。扩展BaseAdapter可以对各个列表项进行最大程度的定制。
3.1 ArrayAdapter
布局页和示意图如下:
布局中只有一个ListView,设置了分隔条为红色。看一下后台代码:
其中定义了一个字符串数组,通过ArrayAdapter进行包装作为listView的数据源,R.layout.array_item则是数据项的布局,代码如下:
(上右图为运行效果图)通过ArrayAdapter实现Adapter很简单、易用,但是它的功能也非常有限,它的每个列表项必须只能是TextView,如果我们想要更负责的列表项,ArrayAdapter就不能胜任了。
3.2 SimpleAdatper
SimpleAdapter是个非常强大的Adapter实现类,绝大多数ListView的使用场景,SimpleAdapter都可以搞定。我们看一组示例:
首先页面布局很简单:
页面只声明了一个ListView
设置分隔线为红色,高度为2px
然后我们定义一个ListViewItem的布局:
页面布局说明:
1.整体采用线性布局,并以水平排列
2.左边第一项定义一个ImageView组件,用来显示图片。
3.右边嵌套一个线性布局,并以垂直排列
4.嵌套的线性布局里面定义了两个TextView,一个显示名字,一个显示介绍。
关于TextView字体、颜色、边距参加代码。
然后我们看一下后台代码:
说明:
1.我们定义了一个字符串数组,用来定义名称。
2.然后又定义了一个字符串数字,用来定义介绍
3.准备几张图片作为头像,拷贝到drawable文件夹,然后定义一个int数组,把图片ID加进来
4.定义一个List<Map<String,Object>>集合,用来存储列表项
5.循环填充数据
6.创建一个SimpleAdapter对象
7.设置ListView的Adapter为刚创建的SimpleAdapter
然后我们来看一下运行效果:
因为手机屏幕显示大小有限,我们定义了四组数据,只显示出了三组,实际操作可以拖动继续显示,大家也可以跟着一起做一下。
那我们如何处理这个ListView的单击事件呢?
我们只需要在后台代码的最后加上绑定事件监听器(选中事件类似,只是选中事件绑定的是OnItemSelection事件):
3.3 BaseAdapter
虽然书上介绍说BaseAdapter是个扩展性很强的Adapter,但我从疯3这本书上并没有学太明白,所以这里占个位,等回头吃透了再把这部分补上有养分的内容。
3.4 ListActivity
如果程序的窗口只需要显示一个列表,就可以让Activity直接继承ListActivity来实现,ListActivity的子类无需调用setContextView方法来显示界面,而是可以直接传入一个内容Adapter,这里不再详细介绍,大家可以直接百度一下内容,我觉得真正要实现高度的可定制化,这个用的不多,所以这里不详细说了。
四、GridView
占位待编辑…
五、AutoCompleteTextView
占位待编辑…
六、ExpandableListView
占位待编辑…
七、AdapterViewFlipper
占位待编辑…
八、StackView
占位待编辑…
九、结语&下章预告
今天因为特殊情况多写了一些内容,不过这个点依旧很困了,所以后面几个小节暂时占位等待编辑,争取白天把内容填充满,对这些内容感兴趣的可以先收藏一下,或者收藏一下这个系列的目录,对您又帮助的别忘记点下推荐!谢谢。
下章预告就是下章的内容会依次说一下关于进度条相关控件的使用方法。
- 2楼DotNet码农
- 不错,期待楼主继续更新!!
- 1楼千年帝国
- 谢谢