本节介绍的列表(List)视图组可以将某种控件按照列表的形式组织起来,它与网格视图组类似,但是附加了更方便的组织方式。
参考示例程序:ListArray(ApiDemo=>Views=>List=>ListArray)
源代码:com/example/android/apis/view/List1.java
ListArray 程序的运行结果如图所示:
本示例显示一系列的字符串,实现的方法是在代码中完成的,没有使用布局文件。 列表视图 ListView 的扩展关系如下所示:
=> android.view.View
=> android.view.ViewGroup
=> android.widget.AdapterView<T extends android. widget.Adapter>
=> android.widget.AbsListView
=> android.widget.ListView
ListView 也扩展了 AbsListView,列表视图的使用方法和网格视图具有很相似的共同点。
ListView 本身的使用方法可以和 GridView 一样,通过构建一个android.widget.BaseAdapter
来完成。在实际的使用过程中,可以使用 ListActivity 这种更简单的方式。在使用列表类 ListView 时通常使用 ListActivity 来代替 Activity,ListActivity 扩展了 Activity 可以方便 ListView的使用,主要的方法包括以下几个:
void setListAdapter(ListAdapter adapter)
// 设置 ListAdapter 作为数据
void onListItemClick(ListView l, View v, int position, long id)
// Item 选择时的函数
本示例程序的实现是一个字符串列表,没有布局文件,直接使用 ListActivity 进行操作,主要的实现部分如下所示:
public class List1 extends ListActivity { // 扩展实现 ListActivity
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setListAdapter(new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, mStrings)); // 设置 ListAdapter
getListView().setTextFilterEnabled(true); //获得 ListView 并进行设置
}
private String[] mStrings = { //....列表项文本};
}
}
ArrayAdapter 是一个模板类(android.widget.ArrayAdapter),它也是 android.widget. BaseAdapter 的实现者。如果需要实现对列表项选择的操作,可以通过实现 ListActivity 的 onListItemClick()等函数完成。ListActivity 类实际上集成了 Activity 和 ListView 的功能,其内部包含了一个 ListView,使用这个类可以直接构造界面中的列表视图。
ListView 也可以有更灵活的方式进行使用:
参考示例程序:ListArray(Views=>List=>ListArray)
源代码:com/example/android/apis/view/List8.java
布局文件:list8.xml
布局文件 list8.xml 如下所示:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<LinearLayout
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<Button android:id="@+id/add"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/list_8_new_photo"/>
<Button android:id="@+id/clear"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/list_8_clear_photos"/>
</LinearLayout>
<FrameLayout
android:layout_width="fill_parent"
android:layout_height="0dip"
android:layout_weight="1" >
<ListView android:id="@android:id/list"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:drawSelectorOnTop="false"/>
<TextView android:id="@+id/empty"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="@string/list_8_no_photos"/>
</FrameLayout>
</LinearLayout>
在这个布局文件,定义了上面的 2 个按钮,主体部分 ListView 部分是空着的,需要在 JAVA 源文件中设置其中的内容。其中的 ListView 的 id是"@android:id/list
",这样当活动是一个 ListActivity 的时候,将可以直接使用这个ListView 作为默认的 ListView,进而获得和 ListActivity 的交互。如果不是用这样的 id 也可以,但是需要在源代码中使用普通的 Activity 并调用函数进行设置。List8.java 中的构造函数如下所示:
public class List8 extends ListActivity {
PhotoAdapter mAdapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.list_8);
getListView().setEmptyView(findViewById(R.id.empty)); //获得 ListView 并设置
mAdapter = new PhotoAdapter(this);
setListAdapter(mAdapter);
// ......省略部分内容
}
}
本例的活动是一个 ListActivity,这里使用的 getListView()将返回布局文件中定义 id 是"@android:id/list
"的ListView。
其中 mAdapter 是自定义的一个 BaseAdapter 类型,也是在这个类中实现的。
public class PhotoAdapter extends BaseAdapter {
private Integer[] mPhotoPool = {
// 图片的资源 ID 数组 };
private ArrayList<Integer> mPhotos = new ArrayList<Integer>();
// ...... 省略部分内容
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
ImageView i = new ImageView(mContext);
i.setImageResource(mPhotos.get(position));
i.setAdjustViewBounds(true);
i.setLayoutParams(
new AbsListView.LayoutParams(LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT));
i.setBackgroundResource(R.drawable.picture_frame);
return i;
}
// ...... 省略部分内容
}
这里的 getView()函数所返回的是 ImageView 类型,这样在列表中显示的内容就可以是一组图片了。