ZetCode

Android ListView 小部件

最后修改于 2012 年 11 月 19 日

在本章的 Android 开发教程中,我们将探讨 ListView 小部件。

ListView 是一个小部件,用于以垂直滚动列表的形式显示项目。Adapter 对象用于用数据填充 ListView

ListView 小部件 I

在示例中,我们展示了一个 ListView 小部件,其中包含我们太阳系行星的名称。我们使用 ArrayAdapter 将数据填充到 ListView 中。

main.xml
<?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 小部件。

row.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 的每一行中,我们都有一个 TextViewsp 是用于设置字体大小的单位。

strings.xml
<?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 文件中的字符串数组属性中指定。

MainActivity.java
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 widget
图:ListView 小部件

ListView 小部件 II

ListActivity 是一个包含 ListView 对象 的特殊 activity。ListView 是一个常见的小部件,通常占据整个屏幕。因此,创建了一个特殊的 activity。在本例中,清单文件未修改。我们也不需要 main.xml 布局文件。

row.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

strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">ListView2</string>
</resources>

这是 strings.xml 资源文件。

MainActivity.java
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() 方法。ListActivityListView 小部件将占据整个屏幕。

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 后,我们必须定义两个抽象方法。第一个方法将当前选定的行星设置为标题栏。第二个方法未实现。

Selected row of a ListView widget
图:ListView 小部件的选定行

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