AdapterView及子类

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

  1. AdapterView继承了ViewGroup,它的本质是容器。
  2. AdapterView可以包括多个“列表项”,并将多个“列表项”以合适的形式显示出来
  3. AdapterView显示的多个“列表项”由Adapter提供。调用AdapterView的setAdapter(Adapter)设置Adapter即可。

从图2.34不难看出,AdapterView派生了三个子类:AbsListView、AbsSpinner和AdapterViewAnimator,这三个子类依然是抽象的,实际使用时往往采用它们的子类。

一、列表视图(ListView)和ListActivity

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

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

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

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

实例:改变分隔条、基于数组的ListView
下面界面布局文件中定义了两个ListView。


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ListView
        android:entries="@array/books"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:divider="#f00"
        android:dividerHeight="2px"
        android:headerDividersEnabled="false">
    ListView>

LinearLayout>

上面界面布局中定义了一个ListView,并通过android:entries指定了列表项数组,该ListView还通过android:divider改变了列表项之间的分隔条。

上面这个ListView指定了android:entries=”@array/books”,该属性值用到了数组资源,因此还需要在应用中定义一个名为books的数组,定义数组的资源文件如下。


<resources>
    <string-array name="books">
        <item>疯狂Java讲义item>
        <item>疯狂Ajax讲义item>
        <item>疯狂XML讲义item>
        <item>疯狂Android讲义item>
    string-array>
resources>

使用数组创建的ListView十分简单,但这种ListView能定制的内容很少,甚至连每个列表项的字号大小、颜色都不能改变。

如果想对ListView的外观、行为进行定制,就需要把ListView作为AdapterView,通过Adapter控制每个列表项的外观和行为。

2.5.2 Adapter接口及实现类
Adapter本身只是一个接口,它派生了ListAdapter和SpinnerAdapoter两个子接口,其中ListAdapter为AbsListView提供列表项,而SpinnerAdapter为AbsSpinner提供列表项。Adapter接口及其实现类的继承关系。

Adapter常用实现类如下。

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

上面布局文件中定义了两个ListView,但是这两个ListView都没有指定android:entries属性,这意味着他们都需要通过Adapter来提供列表项。

接下来Activity为两个ListView提供Adapter,Adapter决定ListView所显示的列表项。
程序如下。

public class MainActivity extends Activity
{
    protected void onCreate(Bundle savedInstanceState)
    {
        ...
        String[] arr1 = {"A","B","C"};
        //将数组包装成为ArrayAdapter
        ArrayAdapter adapter = new ArrayAdapter(this,R.id.array_item,arr1);
        //为ListView设置Adapter
        list1.setAdapter(adpater);
        ...
    }
}

上面程序中的代码创建了ArrayAdapter,创建ArrayAdapter时必须指定如下三个参数。

  • Context:这个参数无须多说,它代表了访问整个Android应用的接口,几乎创建所有组件都需要传入Context对象。
  • textViewResource:一个资源ID,该资源ID代表一个TextView,该TextView组件将作为ArrayAdapter的列表项组件。
  • 数组或者List:该数组或List将负责为多个列表项提供数据。

实例:基于ListActivity实现列表。
如果程序的窗口仅需要显示一个列表,则可以直接让Activity继承ListActivity来实现,ListActivity的子类无须调用setContextView()方法来显示某个界面,而是直接传入一个内容Adapter,ListActivity的子类就呈现出一个列表。

public class MainActivity extends ListActivity
{
    public void onCreate(Bundle savedInstatce)
    {
        super.onCreate(savedInstanceState);
        //无需使用布局文件
        String[] arr = {"A","B","C"};
        //创建ArrayAdapter对象
        ArrayAdapter adapter = new ArrayAdapter(this,android.R.layout.simple_list_item_multiple_choice,arr);
        //设置该窗口显示列表
        setListAdapter(adapter);
    }
}

上面程序的Activity继承了ListActivity,ListActivity无需界面布局文件——相当于布局文件中只有一个ListView,因此只要setAdapter即可。

你可能感兴趣的:(Android)