fresh digitable

めんどくさかったなってことを振り返ったり振り返らなかったりするための記録

AndroidのLiveDataとかViewModelについて考えるとりとめのないこと

  • LiveDataはデータホルダなので、覚えておきたいことを覚えておくために使うのがよい。表示したいデータとか、画面の状態など。私は、イベントやメッセージは受けた人が覚えておくべきものではないと考えているので、イベントバスやメッセージパッシングのために使う時にはなんらかの工夫が必要だと思っている。そういうことがしたくなったらReactive extensionとかを使ったほうがいいかもしれない。
  • ViewModelActivityFragmentではなくViewDataBindingに結びついていると考える。バインドしたいデータのソースが複数種類あるならViewModelを継承したインタフェースか抽象クラスをViewDataBindingクラスにセットできるようにしておく。IntentFragmentのArgumentを使ってViewModelのクラス名を渡すなどしてやれば、ActivityFragmentはどのViewModelを取得すればよいかわかる。
  • LiveDataはたとえ同じオブジェクトがset/postされてもObserver.onChanged()を呼ぶ。これが嫌ならObservableXxx系のクラスを使ってバインドするか、BindingAdapterで前回バインドした値を受け取って新たにセットするかどうか決めるのがいいのだろうか。MediatorLiveDataでラップしたものを使うほうがスマートかもしれない。
  • こういう使い方はよくないのかもしれないけど、ViewModelActivity単位で共有するように作ったかとか、Fragmentごとに別々に持っていてもいいのかとか、ProviderのFactoryとかタグは必要なのかとか、やっているとすぐ忘れてしまうので、ViewModelごとにXxxViewModel.getInstance(FragmentActivity, ViewModelProviders.Factory)みたいな感じのメソッドを用意している。
  • RecyclerViewを持っている画面のViewModelをそれぞれのアイテムビュー(RecyclerViewの子要素)に渡したくなることがあるのだけど、なんとなく違和感を覚えてしまう(なんとなくなので杞憂ならそれでいいんだけど)。データだけならAdapterの中でバインドしてしまえばいいのだと思うのだけど、クリックイベントを拾って選択状態にしたいとか画面遷移したいとかいうことをやろうとするとViewModelでイベントをさばきたくなってしまう。RecyclerViewを持っている画面のViewModelって他に何かやることあるのっていう気もしていて、だったら各アイテムビューにViewModel渡してもいいじゃんと思ったり、実はそういう画面にはそもそもViewModelいらないのでは?と思ったりもして迷宮入りしている。

peaks.cc

peaks.cc