先月出してた groupie-viewbinding
を追加する pull request が今日 merge された。
早速これの入った v2.8.0 のリリースもされた模様。
Release v2.8.0 · lisawray/groupie · GitHub
ものとしては groupie-databinding
ほとんどそのままという感じで、型パラメータが ViewBinding
になっているのと、View Binding には DataBindingUtil#bind
みたいな任意の binding class
のインスタンスを生成する方法がないのでそれについては BindableItem#initializeViewBinding
を override して自分で書いてね、というところがAPI上の差異になる。
簡単な例としては以下のような感じ:
class MyItem(private val data: MyData) : BindableItem<MyItemBinding>() { override fun getLayout(): Int = R.layout.my_item override fun initializeViewBinding(view: View): MyItemBinding = MyItemBinding.bind(view) override fun bind(viewBinding: MyItemBinding, position: Int) { // ... } }
また、プロジェクトのAGPが3.6.0以上だと、 以前ブログで書いた通り ViewDataBinding
が ViewBinding
を implement するようになったので Data Binding も扱うことができ、 Data Binding と View Binding 両方使う場合は groupie-viewbinding
だけ依存を追加すればよくなっている。
ただこれまでに groupie-databinding
を使ったことがある人には groupie-viewbinding
で Data Binding を扱う時にちょっと注意点があって、groupie-databinding
の BindableItem
は ViewHolder が bind される時に内部で ViewDataBiding#executePendingBindings
を実行してくれていたのだけど、 groupie-viewbinding
のはそれがなくなっている。なので binding class に対応する layout が持つ変数や observable object を変更することで view の更新を行う場合には、 override する bind
の実装の中で自分で executePendingBindings
を実行するのを忘れないようにしなければならない。 groupie-databinding
から groupie-viewbinding
に移行する場合は既存の BindableItem
を継承した class 達にはすべて initializeViewBinding
の override をして回る必要があるので、その時に確認を忘れないようにしてほしい。
あと、今回の groupie-viewbinding
の追加で groupie-databinding
が deprecated になった。近い内にメンテも止める予定だそうだ。まあ確かに groupie-viewbinding
が Data Binding も扱えるのでそっちに寄せてしまおうというのはわかるのだけど、新規はともかく groupie-databinding
からの移行となるとユーザにはやや不便を強いることになり、その点については心残りがある。
まとめ
- View Binding サポートの
groupie-viewbinding
が追加された。Data Binding とも使える groupie-databinding
が deprecated になった。メンテも止まる予定- (
groupie-databinding
から移行するユーザ向け)groupie-viewbinding
で Data Binding を扱う場合の変更ポイント:- Binding class のインスタンス生成のために
initializeViewBinding
が必要 bind
の実装の中で layout に持たせた変数や observable objects を経由して view の更新を行っている場合は、最後にexecutePendingBindings
を実行する
- Binding class のインスタンス生成のために