Xamarin.Android ListView

ListView 是 Android 应用程序中一个重要的 UI 组件;应用广泛,从菜单选项的简短列表到联系人或互联网收藏夹的长列表。 它提供了一种简单的方式来显示行的滚动列表,这些行可以使用内置样式进行格式化,也可以进行大量自定义。

概述

列表视图和适配器包含在 Android 应用程序的最基本的构造块中。 ListView 类提供了一种灵活的数据呈现方法,无论是短菜单还是长滚动列表。 它提供快速滚动、索引和单选或多选等可用性功能,有助于为应用程序生成移动友好型用户界面。 ListView 实例需要 适配器 ,以向它馈送行视图中包含的数据。

本指南介绍如何在 Xamarin.Android 中实现 ListView 和各种 Adapter 类。 它还演示了如何自定义 ListView 的外观,并讨论了重新使用行以减少内存消耗的重要性。 此外,还讨论了活动生命周期如何影响 ListViewAdapter 的使用。 如果使用 Xamarin.iOS 处理跨平台应用程序,则 ListView 控件在结构上与 iOS UITableView 类似(Android AdapterUITableViewSource 类似)。

首先,简短教程介绍了 ListView 和一个基本代码示例。 接下来,提供了指向更高级主题的链接,以帮助你在实际应用中使用 ListView

注意

RecyclerView 小组件是 ListView 更高级且更灵活的版本。 由于 RecyclerViewListView(和 GridView)的后续版本,因此我们建议你在开发新应用时使用 RecyclerView,而不是 ListView。 有关详细信息,请参阅 RecyclerView

ListView 教程

ListView 是一个 ViewGroup,用于创建可滚动项的列表。 使用 IListAdapter 将列表项自动插入到列表中。

在本教程中,你将创建从字符串数组中读取的国家/地区名称的可滚动列表。 选择列表项后,toast 消息将显示该项在列表中的位置。

启动名为 HelloListView 的新项目。

创建名为 list_item.xml 的 XML 文件并将其保存在 Resources/Layout/ 文件夹中。 插入以下内容:

<?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="16sp">
</TextView>

此文件定义将放置在 ListView 中的每个项目的布局。

打开 MainActivity.cs 并修改类以扩展 ListActivity(而不是 Activity):

public class MainActivity : ListActivity
{

OnCreate() 方法插入以下代码:

protected override void OnCreate (Bundle bundle)
{
    base.OnCreate (bundle);

    ListAdapter = new ArrayAdapter<string> (this, Resource.Layout.list_item, countries);

    ListView.TextFilterEnabled = true;

    ListView.ItemClick += delegate (object sender, AdapterView.ItemClickEventArgs args)
    {
        Toast.MakeText(Application, ((TextView)args.View).Text, ToastLength.Short).Show();
    };
}

请注意,这不会加载活动(通常使用 SetContentView(int))的布局文件。 相反,设置 ListAdapter 属性将自动添加 ListView,以填充 ListActivity 的整个屏幕。 此方法采用一个 ArrayAdapter<T>,用于管理要放入 ListView 的列表项的数组。 此 ArrayAdapter<T> 构造函数采用应用程序 Context、每个列表项的布局说明(在上一步中创建)和一个 T[]Java.Util.IList<T> 对象数组(插入在 ListView 中)(下一步定义)。

TextFilterEnabled 属性为 ListView 打开文本筛选,以便在用户开始键入时,对列表进行筛选。

ItemClick 事件可用于订阅单击的处理程序。 单击 ListView 中的项时,使用单击的项中的文本,会调用该应用程序,而且 会显示 Toast 消息。

你可以使用平台提供的列表项设计,而不是为 ListAdapter 定义你自己的布局文件。 例如,请尝试使用 Android.Resource.Layout.SimpleListItem1,而不是 Resource.Layout.list_item

添加以下 using 语句:

using System;

接下来,将以下字符串数组添加为 MainActivity 的成员:

static readonly string[] countries = new String[] {
    "Afghanistan","Albania","Algeria","American Samoa","Andorra",
    "Angola","Anguilla","Antarctica","Antigua and Barbuda","Argentina",
    "Armenia","Aruba","Australia","Austria","Azerbaijan",
    "Bahrain","Bangladesh","Barbados","Belarus","Belgium",
    "Belize","Benin","Bermuda","Bhutan","Bolivia",
    "Bosnia and Herzegovina","Botswana","Bouvet Island","Brazil","British Indian Ocean Territory",
    "British Virgin Islands","Brunei","Bulgaria","Burkina Faso","Burundi",
    "Cote d'Ivoire","Cambodia","Cameroon","Canada","Cape Verde",
    "Cayman Islands","Central African Republic","Chad","Chile","China",
    "Christmas Island","Cocos (Keeling) Islands","Colombia","Comoros","Congo",
    "Cook Islands","Costa Rica","Croatia","Cuba","Cyprus","Czech Republic",
    "Democratic Republic of the Congo","Denmark","Djibouti","Dominica","Dominican Republic",
    "East Timor","Ecuador","Egypt","El Salvador","Equatorial Guinea","Eritrea",
    "Estonia","Ethiopia","Faeroe Islands","Falkland Islands","Fiji","Finland",
    "Former Yugoslav Republic of Macedonia","France","French Guiana","French Polynesia",
    "French Southern Territories","Gabon","Georgia","Germany","Ghana","Gibraltar",
    "Greece","Greenland","Grenada","Guadeloupe","Guam","Guatemala","Guinea","Guinea-Bissau",
    "Guyana","Haiti","Heard Island and McDonald Islands","Honduras","Hong Kong","Hungary",
    "Iceland","India","Indonesia","Iran","Iraq","Ireland","Israel","Italy","Jamaica",
    "Japan","Jordan","Kazakhstan","Kenya","Kiribati","Kuwait","Kyrgyzstan","Laos",
    "Latvia","Lebanon","Lesotho","Liberia","Libya","Liechtenstein","Lithuania","Luxembourg",
    "Macau","Madagascar","Malawi","Malaysia","Maldives","Mali","Malta","Marshall Islands",
    "Martinique","Mauritania","Mauritius","Mayotte","Mexico","Micronesia","Moldova",
    "Monaco","Mongolia","Montserrat","Morocco","Mozambique","Myanmar","Namibia",
    "Nauru","Nepal","Netherlands","Netherlands Antilles","New Caledonia","New Zealand",
    "Nicaragua","Niger","Nigeria","Niue","Norfolk Island","North Korea","Northern Marianas",
    "Norway","Oman","Pakistan","Palau","Panama","Papua New Guinea","Paraguay","Peru",
    "Philippines","Pitcairn Islands","Poland","Portugal","Puerto Rico","Qatar",
    "Reunion","Romania","Russia","Rwanda","Sqo Tome and Principe","Saint Helena",
    "Saint Kitts and Nevis","Saint Lucia","Saint Pierre and Miquelon",
    "Saint Vincent and the Grenadines","Samoa","San Marino","Saudi Arabia","Senegal",
    "Seychelles","Sierra Leone","Singapore","Slovakia","Slovenia","Solomon Islands",
    "Somalia","South Africa","South Georgia and the South Sandwich Islands","South Korea",
    "Spain","Sri Lanka","Sudan","Suriname","Svalbard and Jan Mayen","Swaziland","Sweden",
    "Switzerland","Syria","Taiwan","Tajikistan","Tanzania","Thailand","The Bahamas",
    "The Gambia","Togo","Tokelau","Tonga","Trinidad and Tobago","Tunisia","Turkey",
    "Turkmenistan","Turks and Caicos Islands","Tuvalu","Virgin Islands","Uganda",
    "Ukraine","United Arab Emirates","United Kingdom",
    "United States","United States Minor Outlying Islands","Uruguay","Uzbekistan",
    "Vanuatu","Vatican City","Venezuela","Vietnam","Wallis and Futuna","Western Sahara",
    "Yemen","Yugoslavia","Zambia","Zimbabwe"
  };

这是将放入 ListView 的字符串的数组。

运行该应用程序。 你可以滚动列表,也可以键入进行筛选,然后单击某个项查看消息。 你应看到与下面类似的内容:

带有国家/地区名称的 ListView 的示例屏幕截图

请注意,使用硬编码字符串数组不是最佳设计做法。 为简单起见,本教程使用一个来演示 ListView 小组件。 更好的做法是引用由外部资源定义的字符串数组,例如,使用项目 Resources/Values/Strings.xml 文件中的 string-array 资源。 例如:

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <string name="app_name">HelloListView</string>
  <string-array name="countries_array">
    <item>Bahrain</item>
    <item>Bangladesh</item>
    <item>Barbados</item>
    <item>Belarus</item>
    <item>Belgium</item>
    <item>Belize</item>
    <item>Benin</item>
  </string-array>
</resources>

要将这些资源字符串用于 ArrayAdapter,请将原始 ListAdapter 行替换为以下内容:

string[] countries = Resources.GetStringArray (Resource.Array.countries_array);
ListAdapter = new ArrayAdapter<string> (this, Resource.Layout.list_item, countries);

运行该应用程序。 你应看到与下面类似的内容:

带有较小名称列表的 ListView 的示例屏幕截图

进一步使用 ListView

其余主题(链接如下)全面探讨如何使用 ListView 类以及可用于该类的不同类型的适配器类型。 结构如下:

  • 可视外观ListView 控件的各个部分及其工作原理。

  • – 用于显示 ListView 的类的概述。

  • 在 ListView 中显示数据 – 如何显示简单的数据列表;如何实现 ListView's 可用性功能;如何使用不同的内置行布局;以及适配器如何通过重用行视图来节省内存。

  • 自定义外观 – 使用自定义布局、字体和颜色更改 ListView 样式。

  • 使用 SQLite – 如何使用 CursorAdapter 显示来自 SQLite 数据库的数据。

  • 活动生命周期 – 实施 ListView 活动时的设计注意事项,包括应在生命周期中哪个位置填充数据以及何时释放资源。

讨论(分为六个部分)从 ListView 类本身的概述开始,然后逐步介绍更复杂的使用示例。

总结

这组主题介绍 ListView 并提供了有关如何使用 ListActivity 内置功能的一些示例。 它讨论了允许彩色布局和使用 SQLite 数据库的 ListView 的自定义实现,并简要介绍了 ListView 实现上活动生命周期的相关性。