ObservableField 不传播更改
ObservableField not propagating changes
我正在尝试 Android 的数据绑定功能,Observable 字段似乎不会将更改传播到 UI。
如果我扩展 BaseObservable
class 一切都按预期工作,但是当我切换到 ObservableBoolean
或 ObservableField
时,数据会发生变化,但不会传播到UI.
模特
public class User {
public final ObservableBoolean tapped = new ObservableBoolean(false);
public boolean isTapped() {
return tapped.get();
}
public void setTapped(boolean tapped) {
this.tapped.set(tapped);
}
}
布局
<layout
<data>
<variable
name="user"
type="User"/>
....
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:background="@{user.tapped ? @color/colorAccent : @color/white}"
android:onClick="@{() -> user_holder.onClickTest(user)}">
......
</LinearLayout>
</layout>
有什么想法吗?
看来您混淆了糟糕的数据绑定系统。您不仅有一个 public 字段,而且还有 getter 和它的设置器。 Android 数据绑定首先尝试绑定到 getter,如果失败,则绑定到字段。
如果您更改方法中使用的名称的名称(例如 isPersonTapped()
、setPersonTapped(...)
),那么您不会有问题。由于您有访问器方法,您还可以使用私有字段并自己通知更改:
public class User extends BaseObservable {
private boolean tapped = false;
@Bindable
public boolean isTapped() {
return tapped;
}
public void setTapped(boolean tapped) {
this.tapped = tapped;
notifyPropertyChanged(BR.tapped);
}
}
我正在尝试 Android 的数据绑定功能,Observable 字段似乎不会将更改传播到 UI。
如果我扩展 BaseObservable
class 一切都按预期工作,但是当我切换到 ObservableBoolean
或 ObservableField
时,数据会发生变化,但不会传播到UI.
模特
public class User {
public final ObservableBoolean tapped = new ObservableBoolean(false);
public boolean isTapped() {
return tapped.get();
}
public void setTapped(boolean tapped) {
this.tapped.set(tapped);
}
}
布局
<layout
<data>
<variable
name="user"
type="User"/>
....
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:background="@{user.tapped ? @color/colorAccent : @color/white}"
android:onClick="@{() -> user_holder.onClickTest(user)}">
......
</LinearLayout>
</layout>
有什么想法吗?
看来您混淆了糟糕的数据绑定系统。您不仅有一个 public 字段,而且还有 getter 和它的设置器。 Android 数据绑定首先尝试绑定到 getter,如果失败,则绑定到字段。
如果您更改方法中使用的名称的名称(例如 isPersonTapped()
、setPersonTapped(...)
),那么您不会有问题。由于您有访问器方法,您还可以使用私有字段并自己通知更改:
public class User extends BaseObservable {
private boolean tapped = false;
@Bindable
public boolean isTapped() {
return tapped;
}
public void setTapped(boolean tapped) {
this.tapped = tapped;
notifyPropertyChanged(BR.tapped);
}
}