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 小部件。