Compose化する前にGroupieについて簡単に学ぼう!
RecyclerViewのフレームワークであるGroupieは、Androidアプリ開発においてよく使用される重要なライブラリの一つです。この記事では、Groupieライブラリを使用して、効率的かつ柔軟にリストやカードのレイアウトを構築する方法について紹介していきたいと思います。(今回XMLの実装はシンプルなのでXMLの実装は省略しています)
まず初めに通常のRecyclerViewのAdapterにあたるItemについて実装していきましょう。
//Itemの作成
data class HogeItem (
private val text: String,
) : Item<GroupieViewHolder>() {
// ここでデータをビューにバインド
override fun bind(viewHolder: GroupieViewHolder, position: Int) {
...
}
// レイアウトを設定
override fun getLayout() = R.layout.item_hoge
}
次にActivityやFragmentなどのビューを操作する場所でAdapterをセットしましょう。
//Adapterのセットアップ
val recyclerView = findViewById<RecyclerView>(R.id.recycler_view)
val adapter = GroupAdapter<GroupieViewHolder>()
recyclerView.adapter = adapter
最後にアダプターにアイテムを追加してシンプルなGroupieの実装ができました。
//Itemの追加
adapter.add(HogeItem())
次にビューバインディングを使ってGroupieのアイテムを実装するためのクラスであるBinableItemを用いて実装してみました。
・基本的にビューバインディング推奨
それでは早速実装して見ましょう!
data class HogeBindableItem(
private val text: String,
) : BindableItem<ItemHogeBinding>() {
//データをビューバインディングにバインド
override fun bind(viewBinding: ItemHogeBinding, position: Int) {
viewBinding.text = text
}
override fun initializeViewBinding(view: View): ItemHogeBinding{
return ItemHogeBinding.bind(view)
}
override fun getLayout() = R.layout.item_hoge
}
そして通常のItemと同じようにアダプターをセットアップし、アダプターにアイテムを追加しましょう。
Groupie のItemを作成する際はItemのコンストラクタに必ずID(Long型)を渡すようにしよう!
・IDを設定しないと、areItemsTheSameメソッドによってItemが更新された際に同一のビューだと判断されず更新されてしまいリソースの無駄遣いになってしまいます。
data class HogeItem(id: Long) : Item<GroupieViewHolder>(id)
以下はItemとBinableItemの生コードです。
//ID生成の実装
protected Item(long id) {
this.id = id;
}
protected Item(long id) {
super(id);
}
次にGroupieの引数がある場合は、data class,引数がなく尚且つ外部から影響を受けない実装の場合はobjectでItemを作成するようにしよう!
・data classと通常のclassと違いequals()を自動で実装してくれるので、手間が省けます。
data class(private val hoge: Hoge):BinableItem<ItemHogeBinding>{
.....
}
・引数がなく尚且つ外部から影響を受けない実装の場合にobjectで定義する理由は、objectで生成されるインスタンスはシングルトンであり、シングルトンは常に同じインスタンスを参照するため、equals()は必ずtrueを返すためequals()を実装しなくても同一のビューだと判断されるためです。
object HogeHoge: Item<GroupieViewHolder>{
.....
}
最後にBinableItemを使わずにbindingをするパターン
data class HogeItem (text: String) : Item<GroupieViewHolder>() {
override fun getLayout() = R.layout.hoge_item_layout
// ここでデータをビューにバインド
override fun bind(viewHolder: GroupieViewHolder, position: Int) {
HogeItemBinding.bind(viewHolder.itemView).apply{
TextView.text = text
}
}
}
基本的にBinableItemを使う場合と動作はあまり変わらないので、他のファイルのコードの書き方に合わせて書くのがベターだと思います!
最後までお読みいただきありがとうございます!