最近RecyclerViewを使うときにAirbnb製のEpoxyというライブラリを使っています。
素のRecyclerViewだと、データが特定の状態のときにレイアウトを変えたい場合、少しごちゃごちゃしてしまうのと、何よりボイラープレートみたいなものが多くなるのでなんとかしたいなーということでEpoxyを使いました。
Epoxyの他にはGroupieというライブラリもあり、こちらはDroidKaigi2018と2019のアプリにも使われているのでかなり参考になると思われます。
Epoxyを使うと以下のような利点があります。
- EpoxyがAdapterを作ってくれるのでボイラープレートになりがちなAdapterを作らなくてもよい
- RecyclerViewを差分で更新してくれる
- レイアウトファイルを再利用しやすい
- スクロールビューの代わりに使える
DataBindingを使っている場合でもEpoxyはDataBindingに対応しているので使えます。
その場合implementationにDataBinding用のライブラリを追加する必要があります。
def epoxy_version = "3.3.1"
implementation "com.airbnb.android:epoxy:$epoxy_version"
kapt "com.airbnb.android:epoxy-processor:$epoxy_version"
implementation "com.airbnb.android:epoxy-databinding:$epoxy_version"
あとプロジェクトのREADMEだけではなくWikiがしっかりと記載されているので読んでおくとすごいよいと思います。
RecyclerViewは主にリストに使われていると思うのですが、リストを表示するとき大体以下のような要件があると思います。
・リストが空だった場合は空用のビューを表示する
・リストの取得時はローディング
・リスト取得時にエラーが発生した場合はエラー用のビューを表示する
・正しく表示できた場合はリスト表示する
実際は、もっと細かい要件があったりすると思うのですが、よくある要件だと思います。
いろんな説明記事があるので詳しくはそちらをみていただけるとよりわかりやすいですが、RecyclerViewで表示するコンテンツは以下のように組み立てます。
データモデルの状態に応じて何を表示するかわかりやすいのではないかと思います。
(よくわからなかったらすいません。)
あとEpoxyは単なる従来のRecyclerViewのリスト表示だけではなく、Static Content・・・スクロールビューの代わり(多分・・・)にも使えるということが書かれています。
Epoxy: Airbnb’s View Architecture on Android
おそらくAirbnbの多くのAndroidアプリでEpoxyが使われてリスト表示だけではなく通常のコンテンツもRecyclerViewで動いているのではないかと思われます。
実際に自分もリスト表示以外で使っておりますが、すごい効果があります。
特に設定一覧みたいな同じようなレイアウトが続き、かつScrollViewでラップするような画面で非常に効果があります。
ScrollViewにすると縦にがなくなりレイアウトエディタが非常に扱いにくくなります。
Epoxyを使うと少なくともメインのレイアウトにはRecyclerViewだけが存在し、個々のアイテムは専用のレイアウトファイルに分割されます。
ちなみにAirbnbでは入力画面のようなEditTextを持ついわゆる双方向なビューが含まれる画面もEpoxyで作っているみたいです。
次回は入力フォームをEpoxyで作ってみたいと思います。