RealmListをデータバインディングで使うときにハマった


まえおき

自分用のメモです。


models/
// Article.java
public class Article extends RealmObject {
  @PrimaryKey public long id;
  public String title;
  public String body;
  public long published_at;
  public User author;
  public RealmList<Like> likes;
}

// Like.java
public class Like extends RealmObject {
  @PrimaryKey public long id;
  public User user;  
}

みたいなモデルで、

こんな感じのカードUIを作ろうとしました。

細かい説明は省略しますが、ざっくり

android:text="@{article.likes.size()}いいね!"

みたいな感じでいいねの表示をしようとしました。

コンパイルエラー:XXXXXXXXBindingが見つかりません

データバインディングのXMLがなんか間違ってるときに出るエラーですね。

コマンドラインでビルドしてみると、

エラー: cannot generate view binders com.sun.tools.javac.code.Symbol$CompletionFailure: io.reactivex.Flowableのクラス・ファイルが見つかりません
エラー5個

みたいなエラーが出ていました。たぶんこれが根本原因でしょう。

io.reactivex.Flowableのクラス・ファイルが見つかりません???

realm-javaは、RxJavaが使える環境であれば Realm#asFlowable() とか RealmResults#asFlowable() とか使えるようになっています。

Javaでコンパイルするときには、realmのプロセッサがRxJavaのクラスの存在確認をしたりしつつクラス生成するので、うまいことコンパイルエラーにはならないようになっていますが、データバインディングのプリプロセッサだとそこまで考慮してくれてないのでしょう、たぶん...。

回避するには...

  compileOnly 'io.reactivex.rxjava2:rxjava:2.1.7'

app/build.gradle に追記しましょう。