駆け出しエンジニアぱかぱかの成長記録

引くほど忘れっぽい新卒2年目駆け出しSEぱかぱかの備忘録です。

【Android】リストビューのカスタマイズ

どうも、月曜日仕事終わりのぱかぱかです!
週末に取り組んでいた内容の記事投稿が月曜になってしまいました。

 

先週末はなかなか良い時間の過ごし方をできたように思います。

土曜日は謎に朝4時に目覚めてアプリのお勉強をした後

お友達とカフェに行ったり、部活の後輩とご飯を食べたりして過ごしました。

日曜日は昼までぐっすり寝た後、美味しいランチを食べ

カラオケで勉強した後ちょっと歌って、夜は居酒屋でしこたま飲みました。

 

毎週こんな感じで過ごせたらいいですね😳

 

さて今日まとめるのは、先日の記事でも取り組んでいたリストビューの応用編です!

こちらは懐かしきブログ開設1日目の記事です。

radish-se.hatenablog.com

前回の記事ではリストとリストビューを紐づけるアダプタとして

以下の中からArrayAdapterを使用していました。

 

◆アダプタオブジェクトの種類

ArrayAdapter

 元データとしてArrayもしくはMutableListを利用

SimpleAdapter

 元データとしてMutableList<MutableMap<String, *>>を利用

SimpleCursorAdapter

 元データとしてCursorオブジェクトを利用

 

今回はSimpleAdapterを使用してリストビューを作成していきます!

手順はArrayAdapterとほとんど同じですが

MutableList<Mutable<String, *>>を元データとして使っていくので

1行にいくつかの情報を持たせられ、より柔軟性が高くなります。

 

前回は以下のような1行のリストを作成しました。

とてもシンプルですね。

前回作成した1行のリストビュー

 

今回はSimpleAdapterの強みを活かして2行以上のリストを作ってみたいと思います!

よくいる鳥ばかりの発見した鳥リスト

前回のリストビューでは「見たい鳥リスト」を作成しましたが

今回は「発見した鳥リスト」を作成してみたいと思います。

発見した時の情報として発見日時や発見場所もリストに表示されるようにします。

それでは作り方を見ていきましょう!

 

①リストビュー各行のレイアウトファイルを作成

リストビューをカスタマイズするために

まずは各行のレイアウトファイルを作成します。

今回は以下のようにLinearLayoutを組み合わせた構成で作成しています。

リスト1行のレイアウト構成

自分で作ったレイアウトを使えるなら

可能性は無限大ですね…!

 

②発見した鳥リストを生成

今回はSimpleAdapterを使うので

MutableList<MutableMap<String, *>>でデータを作成していきます。

まだDBなどと連携できているわけではないので

手動で以下のようにMutableMapをMutableListに地道に追加してあげますよ…

鳥の名前(birdName)と発見日時(date)と発見場所(place)の

3つの情報を持ったMapにしてみます。

val watchBirdList: MutableList<MutableMap<String, Any>> = mutableListOf()
var watchBird = mutableMapOf<String, Any>("birdName" to "スズメ", "date" to "2023/4/9", "place" to "近所の公園")
watchBirdList.add(watchBird)

 

この"birdName" to "スズメ"という書き方は正直初見なんですよね。

KotlinのMutableMap特有の書き方っぽいです。

なんかわかりやすいですね。

 

③アダプタオブジェクトを作成

SimpleAdapterはインスタンスを生成する際に引数が5個必要になります。

// 上で引数の中身を宣言しておく
private var
_birdList: MutableList<MutableMap<String, Any>> = mutableListOf()
private val _from = arrayOf("birdName", "place", "date")
private val _to = intArrayOf(R.id.tvBirdNameRow, R.id.tvBirdWatchPlaceRow, R.id.tvWatchDateRow)

// onCreateの中でインスタンス生成
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_watch_bird_list)
_birdList =createWatchBirdList()
val lvWatchBirdList = findViewById<ListView>(R.id.lvWatchBirdList)
val adapter = SimpleAdapter(this@WatchBirdListActivity, _birdList, R.layout.row, _from, _to)
lvWatchBirdList.adapter = adapter
lvWatchBirdList.onItemClickListener = ListItemClickListener()
supportActionBar?.setDisplayHomeAsUpEnabled(true)
}

・context: Context 

 表示させたいアクティビティオブジェクト(コンテキスト)

・data: MutableList<MutableMap<String, *>>

 リストデータそのもの

・resource: Int

 リストビューの各行のレイアウトを表すR値

・from: Array<String>

 MutableMapのキー名配列

・to: IntArray

 MutableMapのキー名に対してデータを割り当てられる画面部品のR値配列

 

引数が多いとウッってなっちゃいます…

でも落ち着いてみると、どの画面にどういうデータを

どんなレイアウトに当てはめて表示するかを指定しているだけですね。

配列で持てるので、たくさんの情報を紐づけられそうですが

実務ではそういう使い方してるのか気になります…

他にもやり方ありそうな気がしますね。

 

最後に生成したアダプタオブジェクトを

ListViewのadapterプロパティにセットしてあげたら

生成したデータを持ったリストビューの完成です。

lvWatchBirdList.adapter = adapter

 

この発見した鳥リストのセルをタップしたら

発見した鳥の詳細画面に行けるようにしたいのですが

続きはまた今度ということで!

 

お付き合いいただきありがとうございました😊