AdapterView是一组重要的组件,AdapterView本身是一个抽象基类,它派生的子类在用法上十分相似,只是显示界面有一定的区别,因此我这边将它们归为一类哦,针对它们的共性集中讲解,并突出介绍它们的区别。
AdapterView具有如下特征。
从图2.34不难看出,AdapterView派生了三个子类:AbsListView、AbsSpinner和AdapterViewAnimator,这三个子类依然是抽象的,实际使用时往往采用它们的子类。
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常用实现类如下。
上面布局文件中定义了两个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时必须指定如下三个参数。
实例:基于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即可。