Android ListView 小部件
最后修改于 2012 年 11 月 19 日
在本章的 Android 开发教程中,我们将探讨 ListView
小部件。
ListView
是一个小部件,用于以垂直滚动列表的形式显示项目。Adapter
对象用于用数据填充 ListView
。
ListView 小部件 I
在示例中,我们展示了一个 ListView
小部件,其中包含我们太阳系行星的名称。我们使用 ArrayAdapter
将数据填充到 ListView
中。
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <ListView android:id="@+id/lvId" android:layout_width="fill_parent" android:layout_height="fill_parent" /> </LinearLayout>
在 main.xml
文件中,我们定义了一个 ListView
小部件。
<?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:padding="10dp" android:textSize="20sp"> </TextView>
在 row.xml
文件中,我们定义了列表行的外观。在 ListView 的每一行中,我们都有一个 TextView
。sp
是用于设置字体大小的单位。
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">ListView</string> <string-array name="planets"> <item>Mercury</item> <item>Venus</item> <item>Earth</item> <item>Mars</item> <item>Jupiter</item> <item>Saturn</item> <item>Uranus</item> <item>Neptune</item> <item>Pluto</item> </string-array> </resources>
行星的名称在 strings.xml
文件中的字符串数组属性中指定。
package com.zetcode.listview; import android.app.Activity; import android.os.Bundle; import android.widget.ArrayAdapter; import android.widget.ListView; public class MainActivity extends Activity { private ListView lv; private ArrayAdapter<String> la; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); setupUI(); } public void setupUI() { lv = (ListView) findViewById(R.id.lvId); String[] planets = getResources().getStringArray(R.array.planets); lv.setAdapter(new ArrayAdapter<String>(this, R.layout.row, planets)); } }
这是 MainActivity.java
源文件。
lv = (ListView) findViewById(R.id.lvId);
我们获取到 ListView
小部件的引用。
String[] planets = getResources().getStringArray(R.array.planets);
这行代码从资源文件中检索行星的名称。
lv.setAdapter(new ArrayAdapter<String>(this, R.layout.row, planets));
创建了一个 ArrayAdapter
并将其设置为 ListView
。

ListView 小部件 II
ListActivity
是一个包含 ListView
对象 的特殊 activity。ListView
是一个常见的小部件,通常占据整个屏幕。因此,创建了一个特殊的 activity。在本例中,清单文件未修改。我们也不需要 main.xml
布局文件。
<?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:padding="10dp" android:textSize="20sp"> </TextView>
在 row.xml
文件中,我们定义了 ListView
的每一行中的一个 TextView
。
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">ListView2</string> </resources>
这是 strings.xml
资源文件。
package com.zetcode.listview2; import android.app.ListActivity; import android.os.Bundle; import android.view.View; import android.widget.ArrayAdapter; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.AdapterView.OnItemSelectedListener; import android.widget.ListView; import android.widget.TextView; public class MainActivity extends ListActivity implements OnItemClickListener, OnItemSelectedListener { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setupUI(); } public void setupUI() { ArrayAdapter<String> la = new ArrayAdapter<String>(this, R.layout.row); la.add("Mercury"); la.add("Venus"); la.add("Earth"); la.add("Mars"); la.add("Jupiter"); la.add("Saturn"); la.add("Uranus"); la.add("Neptune"); la.add("Pluto"); setListAdapter(la); ListView lv = getListView(); lv.setOnItemClickListener(this); lv.setOnItemSelectedListener(this); } public void onItemClick(AdapterView<?> parent, View view, int position, long id) { String planet = ((TextView) view).getText().toString(); setTitle(planet); } public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { String planet = ((TextView) view).getText().toString(); setTitle(planet); } public void onNothingSelected(AdapterView<?> parent) { // not implemented } }
我们以编程方式创建 ListView
的项目。我们响应 ListView
的单击和选择事件。我们选择或单击的行星将显示在标题栏中。
public class MainActivity extends ListActivity implements OnItemClickListener, OnItemSelectedListener
MainActivity
扩展了 ListActivity
并实现了两个监听器。通过实现这两个监听器,我们必须实现与这些监听器关联的三个抽象方法。
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setupUI(); }
在 onCreate()
方法中,我们不调用 setContentView()
方法。ListActivity
的 ListView
小部件将占据整个屏幕。
ArrayAdapter<String> la = new ArrayAdapter<String>(this, R.layout.row); la.add("Mercury"); la.add("Venus"); la.add("Earth"); ...
我们创建了一个 ArrayAdapter
的实例。我们将行星名称添加到适配器中。
setListAdapter(la);
为关联的 ListView
对象设置了适配器。
ListView lv = getListView(); lv.setOnItemClickListener(this); lv.setOnItemSelectedListener(this);
从 ListActivity
获取 ListView
小部件。这两个监听器已为 ListView
小部件设置。
public void onItemClick(AdapterView<?> parent, View view, int position, long id) { String planet = ((TextView) view).getText().toString(); setTitle(planet); }
实现 OnItemClickListener
,我们必须定义 onItemClick()
方法。我们从被单击行的 TextView
获取行星名称,并将其设置为标题栏。
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { String planet = ((TextView) view).getText().toString(); setTitle(planet); } public void onNothingSelected(AdapterView<?> parent) { // not implemented }
实现 OnItemSelectedListener
后,我们必须定义两个抽象方法。第一个方法将当前选定的行星设置为标题栏。第二个方法未实现。

在本章的 Android 开发教程中,我们提到了 ListView
小部件。