19

我正在使用 Android 的数据绑定库。我有我的数据对象扩展BaseObservable

public static class SimpleData extends BaseObservable implements Serializable {
    private String text, subText;
    private SpannableString totalText;

    @Bindable
    public SpannableString getTotalText() {
      return totalText;
    }

    public void setTotalText(SpannableString totalText) {
      this.totalText = totalText;
      notifyPropertyChanged(BR.totalText);
    }
}

我的xml也被绑定了

<TextView
    android:id="@+id/patient_name"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceMedium"
    android:layout_marginLeft="16dp"
    android:layout_toRightOf="@+id/patient_image"
    android:textColor="@color/primary_text"
    android:text="@{object.getTotalText()}"/>

绑定发生在初始值上。但是当我使用改变值时

object.setTotalText(someSpannableString);

更改不会反映在文本视图中。可能是什么问题呢?

4

5 回答 5

8

使用字段名称而不是 getter。

<TextView
    android:id="@+id/patient_name"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceMedium"
    android:layout_marginLeft="16dp"
    android:layout_toRightOf="@+id/patient_image"
    android:textColor="@color/primary_text"
    android:text="@{object.totalText}"/>
于 2016-01-18T04:02:01.863 回答
3

需要添加=双向数据绑定:

android:text="@={LoginViewModel.address}"

我忘记添加=所以它没有工作。如果您正在使用,EditText那么想要通过 base 进行两种方式的数据绑定,BaseObservable那么您需要@={LoginViewModel.address}而不是@{LoginViewModel.address}.

于 2019-07-13T14:36:13.507 回答
2

我只是有同样的问题。我的绑定第一次可以工作,然后第二次就不行了。

我的设置与您的设置相同,只是我使用@Bindable了我的 setter 而不是我的 getter 方法。

添加@Bindable到我的 setter 和 getter 为我解决了这个问题。

当我调试数据绑定库的内部工作人员时,我注意到一个名为 request re-bind 的方法没有被调用,因为它执行了一个操作来检查字段是否从最后一个值更新。我的猜测是您需要在这两种方法上进行注释,以便它可以进行内部确认以检查它是否需要重新绑定。

如果这是真的,我不是 100%,但是在这两种方法上都有注释解决了我的问题。查看 Data Binding 库文档,我注意到它们只是在 getter 上显示注释。

你可以试试:

@Bindable
public SpannableString getTotalText() {
  return totalText;
}

@Bindable
public void setTotalText(SpannableString totalText) {
  this.totalText = totalText;
  notifyPropertyChanged(BR.totalText);
}

看看能不能解决。

于 2017-11-27T21:58:19.983 回答
0

我认为你应该将你的String价值观定义为publicnot a private。数据绑定也会自动检测 getter 和 setter,所以只需@{object.totalText}像其他已经说过的那样输入。

我希望这个 Youtube 链接对你也有帮助。

https://www.youtube.com/watch?v=h6ejIx5xu-M

于 2018-08-03T05:02:45.670 回答
-5

使用notifyChange()而不是notifyPropertyChanged(BR._).

于 2018-10-21T17:01:50.777 回答