如何在子POJO中使用@Bindable?

时间:2018-11-11 08:14:14

标签: android android-databinding

我做了一个必须用于2 POJO的布局。所以我创建了一个这样的接口:

public interface GameItemParent {
  ...
  boolean isChecked();
}

子类之一:

public class FavoriteGame implements GameItemParent,Observable {
  @SerializedName(SerCons.C_CHECKED) private int checked;

  private PropertyChangeRegistry registry = new PropertyChangeRegistry();

  public FavoriteGame() {
  }

  @Bindable public boolean isChecked() {
    return checked == 1;
  }

  public void setChecked(boolean checked, boolean notifyObserver) {
    this.checked = checked ? 1 : 0;
    if (notifyObserver)
      registry.notifyChange(this, BR.checked);
  }

  public void inverseChecked() {
    setChecked(!isChecked(), true);
  }

  @Override public void addOnPropertyChangedCallback(OnPropertyChangedCallback callback) {
    registry.add(callback);
  }

  @Override public void removeOnPropertyChangedCallback(OnPropertyChangedCallback callback) {
    registry.remove(callback);
  }
  ...
}

侦听“ isChecked”更改的XML文件:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    >
  <data>
    <import type="android.view.View"/>
    <variable
        name="game"
        type="com.consoleco.console.objectParents.GameItemParent"
        />
  </data>
  <androidx.constraintlayout.widget.ConstraintLayout
      .../>
    <androidx.appcompat.widget.AppCompatCheckBox
        android:id="@+id/checkBox"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:checked="@{game.checked}"
        android:visibility="@{game.hasCheckButton() ? View.VISIBLE : View.GONE}"
        app:buttonTint="?attr/colorAccent"
        app:layout_constraintBottom_toBottomOf="@+id/icon"
        app:layout_constraintEnd_toEndOf="@+id/icon"
        app:layout_constraintStart_toEndOf="@+id/icon"
        app:layout_constraintTop_toBottomOf="@+id/icon"
        />
  </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

您注意到,我将'GameItemParent'接口声明为'游戏'数据。因为我也必须将这个XML用于另一个孩子。

现在,当我在运行时更改“ isChecked”时,UI(实际上是复选框)不会更改。

1 个答案:

答案 0 :(得分:1)

GameItemParent是一个简单的接口,因此绑定库仅知道属性本身。当它还扩展Observable时,它应该可以工作:

public interface GameItemParent extends Observable {
    ...
    @Bindable boolean isChecked();
}