Rso's Jotter

日々の開発の知見のメモやその他雑記

TwoLineListItemの使い方

以下Androidにおいてリスト内のレイアウトを変えるためのメモ


画面をリスト形式で表示したいときはListViewとArrayAdapterを使えば出来るが、
このままだとリスト内の1つの要素に対して1つの文字列しか含めることが出来ない。

Androidのリファレンスを見るとTwoLineListItemというクラスがあるのでこれを使えば
1つの要素に2つの文字列を入れることが出来そう。


というわけで実際にやってみて以下はその手順のメモ。このやり方が正しいやり方かどうかは不明。


まず2つの文字列を格納するための簡単なクラスを定義する。
これはgetterを持つだけの簡単なクラス

/**
 * 2つのStringを持つだけのクラス
 */
public class TwoTextItem {
	private final String primaryText;
	private final String secondaryText;
	
	public TwoTextItem(String p, String s){
		this.primaryText = p;
		this.secondaryText = s;
	}
	public String getPrimaryText() {
		return primaryText;
	}
	public String getSecondaryText() {
		return secondaryText;
	}
}


次にアクティビティに表示するレイアウトを編集する。単純に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="@android:id/list" android:layout_width="wrap_content" android:layout_height="wrap_content"></ListView>
</LinearLayout>


次にリストの要素内のレイアウトを記述する。ここでTwoLineListItemを使う。(ファイル名はtwolist.xmlとする)
さらにTwoLineListItemの内にTextViewを2つ入れておく。これらのViewのIDは必ず@android:id/text1,@android:id/text2にしなければならない。
今回はメインの文字を大きく、もうひとつの文字を青色で小さくした。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content">
<TwoLineListItem android:id="@+id/TwoLineListItem01" android:layout_width="wrap_content" android:layout_height="wrap_content"
 android:tag="twolinelist">
<TextView android:text="" android:id="@android:id/text1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="bottom|center"
	android:textSize="24sp"  android:layout_marginBottom="0sp"
></TextView>
<TextView android:text="" android:id="@android:id/text2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="bottom|center"
	android:textSize="14sp"  android:layout_marginBottom="0sp" android:layout_below="@android:id/text1" android:textColor="#00BFFF"
></TextView>
</TwoLineListItem>

</LinearLayout>


最後にArrayAdapterに要素が追加されたときにViewに値を受け渡しを行うために、
ArrayAdapterを継承したクラスを自分で定義する。

ここではコンストラクタとgetViewをオーバーライドすればよい。

public class TwoTextAdapter extends ArrayAdapter<TwoTextItem>{
	
	private LayoutInflater inflater;
	private final int textViewResource;
	private List<TwoTextItem> items;
	
	TwoTextAdapter(Context context, int textViewResourceId,
			List<TwoTextItem> objects) {
		super(context, textViewResourceId, objects);
		this.textViewResource = textViewResourceId;
		items = objects;
		
		inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
	}
	
	@Override
	public View getView(int pos, View convertView, ViewGroup parent){
		View view = null;
		if(convertView != null){
			view = convertView;
		}else{
			view = this.inflater.inflate(this.textViewResource, null);
		}
		TwoTextItem item = items.get(pos);
                //タグを元にxmlから取ってくる
		TwoLineListItem primaryText = (TwoLineListItem)view.findViewWithTag("twolinelist");
                //ビューに文字列をセット
		TextView primaryView = primaryText.getText1();
		primaryView.setText(item.getPrimaryText());
		 
		TwoLineListItem secondaryText = (TwoLineListItem)view.findViewWithTag("twolinelist");
		TextView secondaryView = secondaryText.getText2();
		secondaryView.setText(item.getSecondaryText());
		
		return view;
	}
}


あとはアクティビティからアダプタを通して値をいれてやる。

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        List<TwoTextItem> items = new ArrayList<TwoTextItem>();
        items.add(new TwoTextItem("メインテキスト", "ここにサブテキストが表示されます"));
        items.add(new TwoTextItem("項目名1", "解説1"));
        items.add(new TwoTextItem("項目名2", "解説2"));
        
        ListAdapter adapter = new TwoTextAdapter(this, R.layout.twolist, items); 
        this.setListAdapter(adapter);
        setContentView(R.layout.main);


こうやっておくと、以下の画面のように1つの要素内に2つの文字列が表示できた。

このような感じでgetViewを適当に変えてやればリスト内の要素は他にも変更できそう。