みんなDataBinding使ってますか?
ぼくはそろそろこれからのAndroidネイティブには必須にしていきたい気持ちでいっぱいです。
DataBindingはBindableメソッドやObservableFieldなどを使って、BaseObservableを継承したクラスからViewに直接値を教えることができます。
findViewByIdしなくていいよやったね!という記事がいっぱいでましたね。
今回はDataBindingの中でも最高なBindingAdapterってやつを紹介します。
BindingAdapter is 何
すさまじく雑にいうと、「Binding先をAdapterしてくれる何か」です。
Adapterパターンのソレだと考えてもらって多分大丈夫です。
ひとまず実際に使ってみましょう。
それっぽいサンプル
仮にListViewにListなパラメータを突っ込んでリストを表示するものをつくるとします。
まず、List<Hoge>
を返すBindableメソッドをBaseObservableなクラスに作成します。
public class Clazz extends BaseObservable {
...
@Bindable
public List<Hoge> getHogeList() {
List<Hoge> hogeList = new ArrayList<>();
// なんか適当にデータ作る
return hogelist;
}
}
ListViewにセットするカスタムArrayAdapterを作成します。
いつものやつですね。
public class CustomArrayAdapter extends ArrayAdapter<ListHoge> {
...
}
次に、アプリケーションパッケージ直下に適当なファイル名でBindingAdapterを作成していくjavaクラスを作成します。
アプリケーションパッケージ直下にあることが重要なので、変な場所に置いたら動きません。
public class BindingAdaptrerUtils {
@BindingAdapter({hoge})
public static void setHogeListAdapter(ListView listView, List<Hoge> hogeList) {
listView.setAdapter(new CustomArrayAdapter(context, hogeList))
}
}
ここまで準備すると、あとはレイアウトxmlのListViewにこのBindingAdapterを紐付けるだけです。
<date>
<variable
name="item"
type="jp.tacksman.sample.Clazz"
>
</data>
<ListView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:hoge="@{item}"
>
はい、これで出来上がりです。
BindingAdapterUtilsの@BindingAdapter({"hoge"})に書いた"hoge"をアトリビューションとして、Adapterをセットするという流れです。
ファットなdataタグから解放されよう
BindingAdapterを導入することで個人的に最高だと思ってるところは、ActivityからAdapterという文字を抹殺できるところかなと思ってます。
setAdapterは勝手にやってくれる上に、BaseObservableなクラスをレイアウトにセットしてやれば、欲しいデータはそこのBindableメソッドから手に入れればよくなります。
これで、AdapterやListenerで膨れ上がりがちなdataタグから解放されます。
しめ
というわけでBindingAdapterのさっくりしたお話でした。
控えめに言って最高なので、DataBindingとBindingAdapterをみんないっぱい使っていこうな!