Android(安卓)ListView 列表视图
Android ListView
(列表视图)是一个将多个项分组并在垂直可滚动列表中显示的视图。使用从源(如数组或数据库)提取内容的适配器(adapter)将列表项自动插入到列表中。
ListView 和 GridView 是 AdapterView
的子类,可以通过将它们绑定到适配器(Adapter)来填充它们,适配器从外部源检索数据并创建表示每个数据项的视图。
Android 提供了 Adapter 的几个子类,这些子类对于检索不同类型的数据和为 AdapterView
(即 ListView 或 GridView)构建视图非常有用。常见的适配器有 ArrayAdapter
、BaseAdapter
,CursorAdapter
和 SimpleCursor
适配器, SpinnerAdapter
以及 WrapperListAdapter
。我们将看到两个适配器的单独实例。
ListView 属性
以下是 ListView
特有的重要属性:
编号 | 属性 & 描述 |
---|---|
1 | android:id 这是唯一标识布局的 ID。 |
2 | android:divider 这是可绘制的或可在列表项之间绘制的颜色。 |
3 | android:dividerHeight 这指定分隔线的高度可以是 px、dp、sp、in 或 mm。 |
4 | android:entries 指定对将填充 ListView 的数组资源的引用。 |
5 | android:footerDividersEnabled 当设置为 false 时,ListView 将不会在每个页脚视图之前绘制分隔线。默认值为 true。 |
6 | android:headerDividersEnabled 当设置为 false 时,ListView 将不会在每个标题视图之后绘制分隔符。默认值为 true。 |
ArrayAdapter(数组适配器)
当数据源是数组时,可以使用此适配器。默认情况下,ArrayAdapter
通过对每个数组项调用 toString()
并将内容放置在 TextView 中,为每个数组项创建一个视图。假设您有一个字符串数组要在 ListView 中显示,请使用构造函数初始化一个新的 ArrayAdapter,以指定每个字符串和字符串数组的布局:
ArrayAdapter adapter = new ArrayAdapter<String>(this,R.layout.ListView,StringArray);
以下是此构造函数的参数:
第一个参数是应用程序上下文。大多数情况下,保持这样。
第二个参数是在XML文件中定义的布局,并且数组中的每个字符串都有 TextView。
最后一个参数是将在文本视图中填充的字符串数组。
创建数组适配器后,只需在 ListView 对象上调用 setAdapter()
,如下所示:
ListView listView = (ListView) findViewById(R.id.listview);
listView.setAdapter(adapter);
您将在 XML 文件中的 res/layout 目录下定义列表视图。对于我们的实例,我们将使用 activity_main.xml 文件。
实例
这个例子将带你通过简单的步骤来展示如何使用 TableLayout
创建你自己的 Android 应用程序。按照以下步骤修改我们在 Hello World 实例 章节中创建的 Android 应用程序:
步骤 | 描述 |
---|---|
1 | 您将使用 Android Studio IDE 创建一个 Android 应用程序,并将其命名为 com.example.ListDisplay 包下的 ListDisplay,如 Hello World 实例一章所述。 |
2 | 修改文件 res/layout/activity_main.xml 的内容来包含 ListView 内容,并使用它的一些属性。 |
3 | 无需更改 string.xml 文件中的默认字符串常量。Android studio 负责默认字符串常量。 |
4 | 创建文本视图文件 res/layout/activity_listview.xml 此文件将具有显示所有列表项的设置因此,您可以自定义其字体、填充、颜色等使用此文件。 |
5 | 运行应用程序以启动 Android 模拟器并验证应用程序中所做更改的结果。 |
下面是修改后的主 activity 文件 src/com.example.ListDisplay/ListDisplay.java 的内容。该文件可以包括每个基本生命周期方法。
package com.example.ListDisplay;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.ArrayAdapter;
import android.widget.ListView;
public class ListDisplay extends Activity {
// Array of strings...
String[] mobileArray = {"Android","IPhone","WindowsMobile","Blackberry",
"WebOS","Ubuntu","Windows7","Max OS X"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ArrayAdapter adapter = new ArrayAdapter<String>(this,
R.layout.activity_listview, mobileArray);
ListView listView = (ListView) findViewById(R.id.mobile_list);
listView.setAdapter(adapter);
}
}
下面是 res/layout/activity_main.xml 文件的内容:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".ListActivity" >
<ListView
android:id="@+id/mobile_list"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
</ListView>
</LinearLayout>
下面是 res/values/strings.xml 文件的内容,定义了两个常量:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">ListDisplay</string>
<string name="action_settings">Settings</string>
</resources>
下面是 res/layout/activity_listview.xml 文件的内容:
<?xml version="1.0" encoding="utf-8"?>
<!-- Single List Item Design -->
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/label"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="10dip"
android:textSize="16dip"
android:textStyle="bold" >
</TextView>
让我们尝试运行我们修改过的 Hello World!我们刚刚修改的应用程序。我假设您在进行环境设置时创建了 AVD。要从 Android Studio 运行应用程序,请打开项目的 activity 文件之一,然后单击工具栏上的运行 Eclipse 图标。Android studio 在您的AVD 上安装应用程序并启动它,如果您的设置和应用程序一切正常,它将显示以下模拟器窗口:
SimpleCursorAdapter(简单游标适配器)
当数据源是数据库 Cursor(游标)时,可以使用此适配器。使用 SimpleCursorAdapter
时,必须指定用于光标中的每一行的布局,以及光标中的哪些列应插入到布局的哪些视图中。
例如,如果要创建人名和电话号码列表,可以执行一个查询,该查询返回一个游标,其中包含每个人的一行以及姓名和号码的列。然后创建一个字符串数组,指定要在每个结果的布局中使用光标中的哪些列,并创建一个整数数组,指定应放置每个列的相应视图:
String[] fromColumns = {ContactsContract.Data.DISPLAY_NAME,
ContactsContract.CommonDataKinds.Phone.NUMBER};
int[] toViews = {R.id.display_name, R.id.phone_number};
实例化 SimpleCursorAdapter
时,传递用于每个结果的布局、包含结果的 Cursor 以及这两个数组:
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
R.layout.person_name_and_number, cursor, fromColumns, toViews, 0);
ListView listView = getListView();
listView.setAdapter(adapter);
然后,SimpleCursorAdapter
使用提供的布局为 Cursor 中的每一行创建一个视图,方法是将每一列的项插入到相应的视图中。