【问题标题】:ObservableField not propagating changesObservableField 不传播更改
【发布时间】:2016-11-15 04:22:15
【问题描述】:

我正在尝试 Android 的数据绑定功能,但 Observable 字段似乎不会将更改传播到 UI。

如果我扩展 BaseObservable 类,一切都会按预期工作,但是当我切换到 ObservableBooleanObservableField 时,数据会发生变化,但不会传播到 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>

有什么想法吗?

【问题讨论】:

    标签: android data-binding android-databinding


    【解决方案1】:

    您似乎对糟糕的数据绑定系统感到困惑。你不仅有一个公共字段,而且还有它的 getter 和 setter。 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);
        }
    }
    

    【讨论】:

    • 这是 getter 和 setter,我删除了它们,现在可以正常工作了,谢谢!
    猜你喜欢
    • 2018-04-18
    • 1970-01-01
    • 1970-01-01
    • 2018-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-05
    相关资源
    最近更新 更多