はじめに
リスト系の表示はAndroidViewではほぼ、RecyclerViewを使うのが一般的だと思いますが、ListViewというものもあるのをご存知でしょうか?
正直新しく実装することになった画面などの場合は、ListViewを使用して実装する必要はほぼないかと思います。
ただし、古いプロジェクトだと諸々の理由によりListViewがまだ息をしていることもあると思います。
今回はそんな状況において現状でもListViewを触らなければならない方向けに、ListViewにHeaderを設定している際に任意のAdapterを取得する方法をまとめておこうと思います。
任意のadapterの取得方法
RecyclerViewの場合はViewTypeなどを指定する形でヘッダーを実装可能だと思いますが、ListViewの場合はヘッダーを設定する関数を備えています。
この違いにより、任意のadapterを取得する方法が異なっているため注意が必要です。
val headerViewListAdapter = binding.listView.adapter as HeaderViewListAdapter
val adapter = headerViewListAdapter.wrappedAdapter as ListViewAdapter
取得方法としては以上になりますが、ListViewの場合Headerを設定していると、設定したAdapterがHeaderViewListAdapterへラップされる仕組みとなっています。
その為、Adapterに設定した任意のAdapterを取得したい場合は、HeaderViewListAdapterが抱えているwrappedAdapterを操作する必要があります。
Headerを簡単に設定できるのは一つ強みであるListViewですが、現状非推奨にはなっていないものの、正直古い設計と呼ばざるおえません。
また、RecyclerViewの方がより柔軟で最適化された機能を提供しているのは明白なので、できる限りRecyclerViewを使うことをお勧めします。
さいごに
ListViewを見ていると、現状の最新であるComposeとの違いを比べてしまい、より一層古さを感じてしまいますね、、、。
これも一つ歴史なんだと思いますが、少しずつでも最新に追随できるように調整を進めていくのが良いと思います。