AdapterView是一组重要的组件,AdapterView本身是一个抽象基类,它派生的子类在用法上十分相似,只是i显示界面有一定的区别,因此本节把他们归为一类,针对他们的共性集中讲解,并突出介绍他们之间的区别。
AdapterView具有如下特征。
>AdapterView继承了ViewGroup,它本质是是容器。
>AdapterView可以包含多个“列表项”,并将多个“列表项”以合适的形式显示出来。
>AdapterView 显示的多个“列表项”由Adapter提供。调用AdapterView的setAdapter(Adapter)仿佛设置Adapter即可。
AdapterView派生了三个子类;AbsListView,AbsSpinner和AdapterVViewAnimator,这三个子类依然是抽象的,实际使用时往往采用他们的子类。
2.5.1 列表视图(ListView)和ListActivity
ListView是手机系统使用非常广泛的一种组件,它以垂直列表的形式显示所有列表项。生成列表视图由如下两种方式。
>直接使用ListView进行创建。
>让Activity继承ListView(相当于该Activity显示的组件为ListView)。
一旦在程序中获得了ListView之后,接下来就需要为ListView设置它要显示的列表项了。哎这一点上。ListView显示出AdapterView的特征:通过setAdapter(Adapter)为之提供列表项即可。
ListView,GridView,Spinner,Gallery等AdapterView都只是容器,而Adapter负责提供每个“列表项”组件,AdapterView则负责采用合适的方式显示这些列表项。
实例;
ListView
<ListView android:entries="@array/books" android:divider="#f00" android:dividerHeight="2px" android:headerDividersEnabled="false" android:layout_width="match_parent" android:layout_height="wrap_content"></ListView>
上面布局文件,通过android:entries指定了列表项数组,该ListView还通过android;divider改变了列表项之间的分割条。
上面这个ListView制定了android:entries="@array@books",该属性用到了数组资源啊,因此还需要在应用中定义一个名为books的数组,定义数组的资源文件如下。
<?xml version="1.0" encoding="utf-8"?> <resources> <string-array name="books"> <item>xjl</item> <item>qxl</item> <item>ywj</item> <item>xjl</item> <item>xjl</item> <item>xjl</item> <item>xjl</item> </string-array> </resources>
2.5.2 Adapter接口及实现类
Adapter本身只是一个接口,它派生了ListAdapter和SpinnerAdapter两个子接口,其中ListAdapter为AbsListView
提供列表项,而SpinnerAdapter为AbsSpinner提供列表项。
ListAdapter,BaseAdapter,ArrayAdapter,simpleAdapter,SimpleCursorAdapter是比较常用的Adapter
几乎所有的Adapter都继承了BaseAdapter,而BaseAdapter同时实现了ListAdapter,SpinnerAdapter两个接口
因此BaseAdapter及其子类可以同时为AbsListView,AbsSpinner提供列表项。
Adapter常用到的实现类如下。
>ArrayAdapter:简单,易用的Adapter,通常用于将数组或者List集合的多个值包装成多个列表项。
>SimpleAdapter:并不简单,功能强大的Adapter,可用于将List集合的多个对象包装成多个列表项。
>SimpleCursorAdapter:与SimpleAdapter基本类似,只是用于包装Cursor提供的数据。
>BaseAdapter: 通常用于被扩展。扩展BaseAdater可以对各列表项进行最大限度的定制。
下面先通过ArrayAdapter来实现ListView。
<ListView android:id="@+id/list1" android:divider="#f00" android:dividerHeight="2px" android:headerDividersEnabled="false" android:layout_width="match_parent" android:layout_height="wrap_content"> </ListView>package com.example.a87188.arrayadaptertest; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.widget.ArrayAdapter; import android.widget.ListView; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ListView list1= (ListView) findViewById(R.id.list1); //定义一个数组 String []arr1={"生物课","物理课","数学课"}; //将数组包装成ArrayAdapter ArrayAdapter<String>adpter1=new ArrayAdapter<String>(this,R.layout.array_item,arr1); //为ListView设置Adapter list1.setAdapter(adpter1); } }ArrayAdapter系统自带item的似乎只能TextView。>Context:这个参数毋庸多言,它代表访问整个Android应用的接口。几乎创建所有组件都需要传入Context
对象。>textViewResourceId:一个资源id,该资源ID代表一个TEXTview,该TextView组件将作为ArrayAdapter的列表项组建
>数组或List: 该数组或List负责为多个列表项提供数据。
从上面介绍不难看出,创建ArrayAdapter时传入的第二个参数控制每个列表项的组件,第三个参数负责给每个组件
提供数据。该数组或数据包含多少个元素,就将生成多少个列表项,每个列表项都是TextView组件,TetxView组件显示的数组或List的元素提供/。