【Android】ListViewを使う(基本)

投稿者: | 2012年7月11日

ListViewはリスト状に項目を表示できるViewである。
今回はListViewの基本的な使い方を見ていくことにする。

まず、サンプルアプリの画面の配置は以下のようにした。

上にあるEditTextに何か文字を入力してボタンを押すと、ListViewに次々と追加されていくようにする。
この画面にxmlは以下のようになる。

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        >
        <EditText 
            android:id="@+id/txtName"
            android:layout_height="fill_parent"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:inputType="text"
            />
        <Button 
            android:id="@+id/btnInsert"
            android:layout_width="wrap_content"
            android:layout_height="fill_parent"
            android:text="Insert"
            />
    </LinearLayout>
    <ListView
        android:id="@+id/listView"
        android:layout_width="fill_parent"
        android:layout_height="0dp"
        android:layout_weight="1"/>

</LinearLayout>

次にActivityのプログラムを示す。

AndroidListViewLessonActivity.java

package com.lesson.lilstview;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;

public class AndroidListViewLessonActivity extends Activity {
	
	private ArrayAdapter<String> adapter;
	private List<String> list = new ArrayList<String>();
	
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, list);
        ((ListView)findViewById(R.id.listView)).setAdapter(adapter);
        
        findViewById(R.id.btnInsert).setOnClickListener(new OnClickListener() {
			
        	private final TextView textView = (TextView)findViewById(R.id.txtName);
        	
			@Override
			public void onClick(View v) {
				list.add(textView.getText().toString());
				adapter.notifyDataSetChanged();
			}
		});
    }
}

ListViewと、その中のデータを関連付けるためにArrayAdapterというクラスを使っている。
16行目でArrayAdapterの参照をメンバ変数として持っておく。
17行目で生成しているString型のArrayListがListViewのデータとなる。
ListAdapterのインスタンスは25行目のonCreate()メソッド内で生成している。
いくつかあるコンストラクタのうち、このサンプルでは引数が

ArrayAdapter(Context context, int textViewResourceId, List<T> objects)

となっているものを使っている。
2番目の引数で指定しているリソースID
「android.R.layout.simple_list_item_1」
はAndroidに標準で含まれているリソースである。
ソースを引用すると以下のような内容となっているようだ。

<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2006 The Android Open Source Project

     Licensed under the Apache License, Version 2.0 (the "License");
     you may not use this file except in compliance with the License.
     You may obtain a copy of the License at
  
          http://www.apache.org/licenses/LICENSE-2.0
  
     Unless required by applicable law or agreed to in writing, software
     distributed under the License is distributed on an "AS IS" BASIS,
     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     See the License for the specific language governing permissions and
     limitations under the License.
-->

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/text1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:gravity="center_vertical"
    android:paddingLeft="6dip"
    android:minHeight="?android:attr/listPreferredItemHeight"
/>

この内容によれば名前のとおりシンプルなTextViewが一つ定義されているだけである。
これがListViewの1項目に相当するようになる。

33行目からがボタンが押されたときの処理となる。
まず34行目で、TextViewの内容をリストに追加している。
注意が必要なのは、ListViewのデータ元となるリストに変更を加えただけでは
表示に反映されないことである。
次の行で、ListView側にデータ元の内容が変更されたことを通知するため、
ArrayAdapterのnotifyDataSetChanged()メソッドを呼んでいる。

アプリを実行すると、以下のようになる。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です