ListViewをカスタマイズする
今回はTwitter風の画面を作成してみます。
Androidでデータを一覧で表示したい場合、ListViewを使う方法があります。
ListViewはこのように表示されます。
ですが、今回のようにTwitter風に表示したい場合は、表示部分をカスタマイズしなければなりません。
そこで今回はListViewのカスタマイズ方法のご紹介です。
こんな画面にカスタマイズしてみます。
ListActivityの使い方
リストを表示する画面を作りたい場合、ListActivityを使うと便利です。
ListActivityでは、表示したいデータとビューをマッピングするために、ListAdapterを使います。
単純に文字列だけのリストを表示したい場合はこんなコードで作れます。
シンプルですね。
ArrayAdapterは渡されたデータ(items)をTextViewのtextにセットして、Activityに返し、Acitivityが渡されたビューを表示する、という処理を内部でしています。
その処理を行うのはArrayAdapter#getViewメソッドです。なので、この処理をオーバーライドしてあげれば、自分の好きなビューを表示できるようになります。
というわけで、ArrayAdapterを継承して、Twitter風にデータとビューをマッピングさせるTwitterAdapterクラスを作成します。
TwitterAdapterクラスの作成
TwitterAdapterクラスの作成の前に、twitterデータを表すTwitterStatusクラスを作成しましょう。
Twitterクラスは名前とつぶやきを保持するシンプルなクラスです。
次にTwitterAdapterクラスを作成します。
twitterAdapterクラスはプライベートなフィールドとして、ArrayListとLayoutInflaterを持っています。
ArrayListはgetViewメソッドの中で該当するデータを取得するために、コンストラクタ内でセットしています。
LayoutInflaterはxmlのレイアウトファイルからビューを生成してくれるクラスで、こちらもgetViewメソッド内で使います。
LayoutInflaterはContextから取得できるので、コンストラクタ内でセットしています。
カスタマイズ用レイアウト定義ファイルの作成
layoutを定義したtwitter_row.xmlは以下です。res/layoutフォルダ内に配置しておきます。
上記の定義で行の左側に画像、右側2段にテキストを表示するレイアウトを設定しています。
# ここではアイコンファイルは固定で指定しています。やっつけではありません。
定義ファイルの定義の仕方は、res/layout/main.xmlの場合と同様なので、ここでは多くは語りません。
カラー定義
上のtwitter_row.xmlではテキストの色を別に定義された値から読み込んでいます。
やっつけですが、string.xml内に以下のように追加しました。
行の背景
背景には画像を使用しています。以下の画像をback.pngとしてres/drawable-hdpi, res/drawable-ldpi, res/drawable-mdpiに放り込んでおきます。
アイコン画像
上の定義では、アイコン画像はres/drawable/twitter_logo_techfirm01_bigger.pngを読んでいるので、自分で表示したいファイルに置き換えてください。
ListActivityの作成
ここまでくればカスタマイズは終わったも同然です。以下のようにListActivity(ここではMainAcitityクラスとしています)を変更します。
実際にはtwitter APIを叩いてレスポンスを受け取り、データをパースしてArrayListを生成する処理が必要ですが、今回はListViewのカスタマイズがメインなので、createDummyDataで代用しています。
ListViewのカスタマイズは以上です。
お疲れ様でした。
参考
- Hello, ListView | Android Developers
- Android Developers Blog: Android Layout Tricks #1
- ListActivity | Android Developers
- TextView | Android Developers
- Available Resource Types | Android Developers
- Android Developers Blog: Why is my list black? An Android optimization
http://labs.techfirm.co.jp/android/cho/751 ListViewをカスタマイズする | Techfirm Android Lab
This comment was originally posted on Twitter
とても助かりました。感謝します。