次の方法で共有


Xamarin.Android ListView

ListView は Android アプリケーションの重要な UI コンポーネントです。これは、メニュー オプションの短いリストから、連絡先やインターネットのお気に入りの長いリストまで、あらゆる場所で使用されます。 組み込みスタイルで書式設定したり、広範囲にカスタマイズしたりできる行のスクロール リストを表示する簡単な方法が提供されます。

概要

リスト ビューとアダプターは、Android アプリケーションの最も基本的な構成要素に含まれています。 ListView クラスでは、短いメニューでも長いスクロール リストでも、データを表示する柔軟な方法が提供されます。 高速スクロール、インデックス、単一または複数の選択などの操作性を考慮した機能が提供され、アプリケーションのモバイル対応ユーザー インターフェイスを構築するのに役立ちます。 ListView インスタンスでは、行ビューに含まれているデータをフィードするための Adapter が必要です。

このガイドでは、Xamarin.Android で ListView とさまざまな Adapter クラスを実装する方法について説明します。 また、ListView の外観をカスタマイズする方法を示し、メモリ消費量を減らすために行を再利用することの重要性についても説明します。 また、アクティビティ ライフサイクルが ListViewAdapter の使用にどのように影響するかについても説明します。 Xamarin.iOS を使用してクロスプラットフォーム アプリケーションで作業している場合、ListView コントロールは iOS UITableView と構造的に似ています (Android AdapterUITableViewSource に似ています)。

まず、短いチュートリアルでは、基本的なコード例を使用して ListView について紹介します。 次に、実際のアプリで ListView を使用するのに役立つ、より高度なトピックへのリンクが提供されています。

Note

RecyclerView ウィジェットは、ListView のより高度で柔軟なバージョンです。 RecyclerViewListView (および GridView) の後継として設計されているため、新しいアプリ開発には ListView ではなく、RecyclerView を使用することをお勧めします。 詳細については、「RecyclerView」を参照してください。

ListView のチュートリアル

ListView は、スクロール可能なアイテムのリストを作成する ViewGroup です。 リスト アイテムは、IListAdapter を使用して自動的にリストに挿入されます。

このチュートリアルでは、文字列配列から読み取られた国/地域名のスクロール可能なリストを作成します。 リスト アイテムが選択されると、トースト メッセージにリスト内のアイテムの位置が表示されます。

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 を開き、(Activity ではなく) ListActivity を拡張するようにクラスを変更します。

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 の画面全体が塗りつぶされます。 このメソッドは、ListView に配置されるリスト アイテムの配列を管理する ArrayAdapter<T> を受け取ります。 .ArrayAdapter<T> コンストラクターは、アプリケーション Context、各リスト アイテムのレイアウトの説明 (前の手順で作成)、オブジェクトの T[] または Java.Util.IList<T> 配列を受け取って ListView (次に定義) に挿入します。

.TextFilterEnabled プロパティでは、ユーザーが入力を開始したときにリストがフィルター処理されるように、ListView のテキスト フィルター処理を有効にします。

.ItemClick イベントを使用して、クリックのハンドラーをサブスクライブできます。 アイテム ( ListView 内) をクリックすると、ハンドラーが呼び出され、クリックしたアイテムのテキストを使用して、Toast メッセージが表示されます。

ListAdapter の独自のレイアウト ファイルを定義する代わりに、プラットフォームによって提供されるリスト アイテム設計を使用できます。 たとえば、Resource.Layout.list_item の代わりに Android.Resource.Layout.SimpleListItem1 を使用してみます。

次の 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 アクティビティを実装する際の設計上の考慮事項。

説明 (6 つの部分に分かれている) は、ListView クラス自体の概要から始まり、その使い方のより複雑な例を段階的に紹介します。

まとめ

この一連のトピックでは、ListView について紹介し、ListActivity の組み込み機能を使用する方法の例をいくつか示しました。 カラフルなレイアウトと SQLite データベースの使用を可能にする ListView のカスタム実装について説明し、ListView 実装のアクティビティ ライフサイクルの関連性について簡単に説明しました。