我做了一个必须用于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(实际上是复选框)不会更改。
答案 0 :(得分:1)
GameItemParent
是一个简单的接口,因此绑定库仅知道属性本身。当它还扩展Observable
时,它应该可以工作:
public interface GameItemParent extends Observable {
...
@Bindable boolean isChecked();
}