Androidのチュートリアル – Tutorials > Hello, Views | List Layout

List Layout はリスト形式での複数アイテムを表示するコンテナです。

ListLayout という名前で新規にプロジェクトをつくります。

リストアイテム用レイアウト作成

res/layout/item_list.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="16sp" >
</TextView>

このレイアウトは、リストの各行に対して使われるレイアウトになります。

今回中身はただ、TextView が一個入っているだけです。

リストにサムネイルなどをつけたい場合はここら辺に定義するのでしょう。

継承元クラスを変更する

リストを扱う場合は、メインのアクティビティの継承元を ListActivity にします。

import android.app.ListActivity;
import android.os.Bundle;

public class ListLayoutActivity extends ListActivity {
...
}

初期化時のコードを修正

onCreate() でタブやアクティビティの初期化をします。

    public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);

      setListAdapter(new ArrayAdapter<String>(this, R.layout.list_item, COUNTRIES));

      ListView lv = getListView();
      lv.setTextFilterEnabled(true);

      lv.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View view,
            int position, long id) {
          // When clicked, show a toast with the TextView text
          Toast.makeText(getApplicationContext(), ((TextView) view).getText(),
              Toast.LENGTH_SHORT).show();
        }
      });
    }

まだ、COUNTRIES という変数がないのでエラーになります。ここに、リスト表示させる要素を渡します。

リストを表示するだけなら、setListAdaptor() までを実行するだけで、リスト表示は完成します。

lv.setTextFilterEnabled(true); はリスト要素の絞込みを提供し、シミュレータ上でキーを打つと、その文字にマッチする要素が絞り込まれます。

lv.setOnItemClickListener() では行を選択したときのイベントを定義しています。

入り組んでいますが、行をタッチすると、その行の文字列を Toast (リスト上にポップアップして表示され、しばらくすると消える) で表示する挙動を設定しています。

とりあえずはそれくらいのトーンで理解しておけばよいと思います。

リスト表示する要素の配列

リストに渡す、文字列を持った配列をクラス定数として定義します。

onCreate() のすぐ次に定義すればよいです。

    static final 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"
      };

実装が完了したら起動させてみます。

スクロールが可能なリストビューが完成しました。

lv.setTextFilterEnabled(true) や lv.setOnItemClickListener() をコメントアウトなどで無効にして、それらの挙動も確認してみるとよいでしょう。

リストアイテム配列を外部に取り出す

COUNTRIES というクラス定数を作り、そこに、国名を配列で定義しました。

もちろん、このハードコーディングはあまりよい方法とはいえないので、もう少しメンテナンス性を考慮して、リソース化してみます。

文字列の配列を res/values/strings.xml に <string-array> をつかって定義します。

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="hello">Hello World, ListLayoutActivity!</string>
    <string name="app_name">ListLayout</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>

setListAdaptor() の直前で、リソースから xml で定義した配列を getResource() 経由で取り出します。

後は、とりだした配列を、COUNTRIES の代わりにアダプタに渡すように書き換えます。

      String[] countries = getResources().getStringArray(R.array.countries_array);
      setListAdapter(new ArrayAdapter<String>(this, R.layout.list_item, countries));

これでハードコーディングだった国名リストを res/values/string.xml に分離することができました。

唐突に、Adaptor や Toast が出てきて、正直よくわかりませんでした。

Adaptor については、リストビューとデータ配列のやり取りをスムーズにするインターフェイスのようなものと捕らえればよさそうです。

Toast については別途調べる必要がありそうです。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする