kobakei's blog

たまに書きます

shibuya.apk 13で登壇しました #shibuya_apk

Intermediate Level Data Bindingというタイトルで発表しました。

speakerdeck.com

また、サンプルコードはこちらにあります。

github.com

基本的にはデータバインディング使ったことない/簡単なとこでは使ってる人に、BindingAdapterやリストとの連携などもう少し突っ込んだ使い方を紹介するというセッションでした。

かなり発表時間が伸びてしまい、ちょっと後半駆け足になってしまい、楽しみにしてくれてた方申し訳ありませんでした。懇親会で何人かの方から「もっと見たかった」「データバインディングについて相談したい」といって頂けたのがせめてもの幸いでした。

ざっくりとですが、昨日のセッションで話したかったことを以下にまとめます。

会場アンケート

  • データバインディングを使っている: 6割
  • BindingAdapterを使ったことがある: 6割
  • InverseBindingMethodなどを使ったことがある: ほとんどいない(1,2人だけ)
  • ObservableListを使ったことがある: 2割

BindingAdapter

データバインディングの属性を自分で追加する仕組みです。Picassoによる画像読み込みをBindingAdapter化するのは割とメジャーですでに使ってる人も多いかもしれませんが、リスナーや双方向データバインディングを追加する方法は結構めんどくさいので、これらの実装方法を紹介しました。「データバインディング」と言いつつ、ビューモデルなどのデータとバインディングしない使い方もあり、単なるXML属性の拡張としても使えるので、今のアプリの設計を大幅に変えなくてもXML属性の拡張として導入しやすいと思います。

リストとの連携

ObservableListとRecyclerView.Adapterを組み合わせる方法を紹介しました。ObservableListには要素の追加・削除・移動などのリスナを登録できるので、その中でRecyclerView.Adapterのnotify…を呼ぶというのが肝です。当日紹介しませんでしたが、MVVMで実装する場合は、画面全体のビューモデルとリストアイテム一個のビューモデルを用意する実装を自分はよく使います。この辺の設計についてはこれだけで話せる内容なので、別の機会に発表したいと思います。

詰まりやすいところ

(完全に時間がなくて飛ばしました)

時間があれば、データバインディングによるUI更新時のチラツキを抑える方法と、スレッドに関する注意を話す予定でした。

  • 即時UI更新には、ViewDataBinding#executePendingBindings() を呼ぶ
  • コレクションを操作するときはメインスレッド。それ以外はどのスレッドからでも操作できる

ということが伝えたかったことです。

まとめ

ということで、一歩先を行くデータバインディングについてお話しました。 何か質問などがある方は、 Twitter: ksk_kbys までお願いします。