2015年7月25日土曜日

Android開発 LayoutInflaterを利用してListViewをカスタマイズする

Androidのリスト表示をカスタマイズして、クリック、長押しに反応するようにします。
リスト表示の見た目を変えるために、LayoutInflaterを利用します。
http://developer.android.com/intl/ja/reference/android/view/LayoutInflater.html

とくになにもせずAndroidのListViewを表示したときは、単一のテキストまたはボタンなどが行になって表示されます。
色々な要素をリスト表示したいときには、たとえば、Webサイトの場合だとループの中にHTMLを書くだけで済むのですが、Androidの場合は、LayoutInflaterを利用してListViewの中に動的にxmlを差し込んで表示したりする必要があります。
また、リストをスクロールしたとき、リストの要素が再利用されるので、リスト番号が単純に上から順にインクリメントされているわけではなく、クリックでリスト番号を取得するための挙動を制御する必要がありました。
このように、Androidでのリストの扱いは、ひとくせある感じになっています。

目的を実現するにあたって、以下の資料を参考にしました。

androidでRSSを取得して一覧表示 - m_shige1979のささやかな抵抗と欲望の日々
http://m-shige1979.hatenablog.com/entry/2015/07/15/080000
Adapter#getViewの挙動について - hyoromoのブログ
http://hyoromo.hatenablog.com/entry/20090912/1252777077
Android -ListView(イベント処理)- <MitoRoid>
http://mitoroid.com/category/android/android_listview3.php
LayoutInflater - Androyer in Japan
https://sites.google.com/site/androyerjapan/home/layoutinflater
ListView で onItemClick() と onItemLongClick() を両立 - Unmotivated
http://blog.lciel.jp/blog/2013/11/22/onitemclick-vs-onitemlongclick/

以下、コードの解説です。

MainActivity.java

リストの要素を作ります。ArrayAdapterを継承したrowAdapaterをリストビューに渡しています。
クリック・長押しされたときにトーストを表示するようにします。

RowDetail.java

リストの要素を保存する際に使用するクラスです。

RowDetailAdapter.java

リストビュー用のアダプターです。
リストをスクロールして、新しい行が表示されるタイミングでgetViewが実行されます。
レイアウトが初めて作成される場合のみLayoutInflaterを実行します。それ以外は、表示されなくなったViewが引数に渡されてくるので再利用します。

activity_main.xml

ListViewを表示します。

row.xml

ListViewの中身になります。