Android精讲--界面编程5(AdapterView及其子类)

列表视图(ListView)和ListActivity

AdapterView组件是一组重要的组件,AdapterView本身是一个抽象基类,它派生的子类
在用法上十分相似,只是显示界面有一定的区别,因此本节把它们归为一类,针对它们的共性集中讲解,并突出介绍它们的区别。
AdapterView如下特征。

  • AdapterView继承了ViewGroup.它的本质是容器。
  • AdapterView可以包括多个“列表项”,并将多个“列表项”以合适的形式显示出来。
  • AdapterView显示的多个“列表项”由Adapter提供。调用AdapterView的setAdapter(Adapter)方法设置Adapter即可。
AdapterView及其子类的继承关系图

ListView是手机系统中使用非常广泛的一种组件,它以垂直列表的形式显示所有列表项。
创建ListView有如下两种方式。

  • 直接使用ListView进行创建。
  • 让Activity继承ListActivity(相当于该ActivityM示的组件为ListView)。

一旦在程序中获得了ListView之后,接下来就需要为ListView设置它要思示的列表项了。在这一点上,ListView表显示出AdapterView的特征:通过setAdapter(Adapte)方法为之提供Adapter、并由Adapter提供列表项即可。

ListView、GridView.Spinner,Gallery等AdapterView都只是容器,而Adapter负责提供每个“列表项”组件,AdapterView则负责采用合适的方式显示这些列表项。

# AbsListView常用XML属性

XML属性 相关方法 说明
android:choiceMode 设置AbsListView的选择行为。该属性支持如下属性值。
none:不显示任何选中项
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 设置是否对列表项进行过滤。当该AbsListView对应的Adapter实现了Filter接口时该属性才会起作用
android:transcriptMode 设置该组件的滚动模式。该属性支持如下属性值。
disable:关闭滚动。这是默认值
normal:当该AbsListView受到数据改变通知,且最后一个列表项可见时,该AbsListView将会滚动到底端
alwaysScroll:该AbsListView总会自动滚动到底端

# ListView常用XML属性

XML属性 说明
android:divider 设置List列表项的分隔条(即可用颜色分隔,也可用Drawable分隔)
android:dividerHeight 设置分隔条的高度
android:entries 指定一个数组资源,Android将根据该数组资源来生成ListView
android:footerDividersEnabled 如果设置为false,则不在footer View之前绘制分隔条
android:headerDividersEnabled 如果设置为false,则不在header View之后绘制分隔条

实例:改变分隔条、基于数组的ListView



    
    
    

上面的界面布局中定义了一个ListView, 并通过android:entries指定了列表项数组,该ListView还通过android:divider改变了列表项之间的分隔条。
上面第一个ListView指定了android:entries="@array/books",该属性值用到了数组资源,因此还需要在应用中定义一个名为books的数组,定义数组的资源文件如下:



    
        Java
        Ajax
        XML
        Android
    

Adapter接口及实现类

Adapter本身只是一个接口,它派生了ListAdapterSpinnerAdapter两个子接口,其中ListAdapterAbsListVlew提供列表项,而SpinnerAdapterAbsSpinner提供列表项。

Adapter及其子类的继承关系图

Adapter常用的实现类如下。

  • ArrayAdapter: 简单、易用的Adapter。通常用于将数组或List集合的多个值包装成多个列表项。
  • SimpleAdapter: 并不简单、功能强大的Adapter.可用于将List集合的多个对象包装成多个列表项。
  • SimpleCursorAdapter: 与SimpleAdapter基本相似,只是用于包装Cursor提供的数据。
  • BaseAdapter: 通常用于被扩展。扩展BaseAdapter可以对各列表项进行最大限度的定制。

# 实例:使用 ArrayAdapter创建 ListView








上面的布局文件定义了两个ListView,但这两个ListView都没有指定android:entries属性,这意味着它们都需要通过Adapter来提供列表项。
接下来Activity为两个ListView提供Adapter,Adapter决定ListView所显示的列表项。程序如下:

package org.crazyit.ui;

import android.app.Activity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;

/**
 * Description:
 * 
site: crazyit.org *
Copyright (C), 2001-2014, Yeeku.H.Lee *
This program is protected by copyright laws. *
Program Name: *
Date: * @author Yeeku.H.Lee [email protected] * @version 1.0 */ public class ArrayAdapterTest extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); ListView list1 = (ListView) findViewById(R.id.list1); // 定义一个数组 String[] arr1 = { "孙悟空", "猪八戒", "牛魔王" }; // 将数组包装ArrayAdapter ArrayAdapter adapter1 = new ArrayAdapter (this, R.layout.array_item, arr1); // 为ListView设置Adapter list1.setAdapter(adapter1); ListView list2 = (ListView) findViewById(R.id.list2); // 定义一个数组 String[] arr2 = { "Java", "Hibernate", "Spring" , "Android" }; // 将数组包装ArrayAdapter ArrayAdapter adapter2 = new ArrayAdapter (this, R.layout.checked_item, arr2); // 为ListView设置Adapter list2.setAdapter(adapter2); } }

通过ArrayAdapter实现Adapter虽然简单、易用,但ArrayAdapter的功能比较有限。它的每个列表项只能是TextView。如果开发者需要实现更复杂的列表项,则可以考虑使用SimpleAdapter,
不要被SimpleAdapter的名字欺骗,SimpleAdapter并不简单,而且它的功能非常强大。ListView的大部分应用场景,都可以通过SimpleAdapter来提供列表项。

自动完成文本框(AutoCompleteTextView)的功能和用法

自动完成文本框(AutoCompleteTextView)从EditText派生而出,实际上它也是一个文本编辑框,但它比普通编辑框多了一个功能:当用户输入一定字符之后,自动完成文本框会
显示一个下拉菜单,供用户从中选择,当用户选择某个菜单项之后,AutoCompleteTextView按用户选择自动填写该文本框。

网格视图(GridView)功能和用法

GridView用于在界面h按行、列分布的方式来显示多个组件。GridView和ListView有共同的父类:AbsListView,因此GridView和ListView具有很高的相似性,它们都是列表项。
GridView与ListView的唯一区别在于:ListView只显示一列;而GridView可以显示多列。
从这个角度来看,ListView相当于一种特殊的GridView,如果让GridView只显示一列,那么该GridView就变成了ListView。
与ListView类似的是,GridView也需要通过Adapter来提供显示的数据:开发者可以采用上面介绍的4种方式中的任意一种来创建Adapter。不管使用哪种方式, GridView与ListView的用法是基本一致的。

可展开的列表组件(ExpandableListView)

ExpandableListView是ListView的子类,它在普通LislView的基础上进行了扩展,它把应用中的列表项分为几组,每组里又可包含多个列表项。
ExpandableListView的用法与转通ListView的用法非常相似,只是ExpandableListView所显示的列表项应该由ExpandableListAdapter提供。

ExpandableListAdapter及其子类的类图
Spinner的功能和用法

Spinner其实就是一个列表选择框,不过Android的列表选择框并不是需要显示下拉列表的,而是相当于弹出一个菜单供用户选择。
Spinner与Gallery都继承了AbsSpinner,AbsSpinner继承了AdapterView,因此它也表现出AdapterView的特征:只要为AdapterView提供Adapter即可。

画廊视图(Gallery)的功能和用法

Gallery与Spinner组件有共同的父类:AbsSpinner,表明Gallery和Spinner都是一个列表框-它们之间的区别在于Spinner显示的是一个垂直的列表选择框,而Gallery显示的是一个水平的列表选择框。
Gallery与Spinner还有一个区别:Spinner的作用是供用户选择,而Gallery则允许用户通过拖动来査看上—个、下一个列表项。

Android已经不再推荐使用Gallery组件,而是推荐使用其他水平滚动组件。如HorizontalScrollView和ViewPager来代替Gallery组件。因此在新版本的Android平台上应该尽量少用Gallery组件

AdapterViewFlipper的功能与用法

AdapterViewFilpper继承了AdapterViewAnimator,它也会显示Adapter提供的多个View组件,但它每次只能显示一个View组件,程序可通过showPrevious()和showNext()方法控制该组件显示上一个、下—个组件。
AdapterViewFilpper可以在多个View切换过程中使用渐隐渐现的动画效果,除此之外,还可以调用该组件的startFlipping()控制它“自动播放”下一个View组件。

StackView的功能与用法

StackView也是AdapterViewAnimator的子类,它也用于BI2.48使用AdapterViewFlipper显示Adapter提供的系列View。StackView将会以“堆赍实现自动播放图片(Stack)”方式来显示多个列表项,
为了控制StackView显示的View组件,SlackView提供了如下两种控制方式。

  • 拖走StackView中处于顶端的View,F+-个View将会显示出来。将上一个View拖进StackView,将使之显示出来。
  • 通过调用StackView的showNext〇、showPrevious〇控制显示上一个、上一个组件。

你可能感兴趣的:(Android精讲--界面编程5(AdapterView及其子类))