Android:数据绑定,notifyPropertyChanged()不工作?

时间:2015-12-15 16:50:30

标签: android android-databinding

我正在使用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);

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

5 个答案:

答案 0 :(得分:7)

使用字段名称而不是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}"/>

答案 1 :(得分:1)

我遇到了同样的问题。我的绑定将在第一次工作,然后第二次不能工作。

我有一个与你相同的设置,除了我把@Bindable放在我的setter上而不是我的getter方法。

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

  

当我调试数据绑定库的内部工作者时   注意到没有调用一个名为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);
}

看看它是否解决了它。

答案 2 :(得分:0)

我认为您应该将String值定义为public而不是private。 另外,dataBinding会自动检测getter和setter,因此只需输入“ @ {object.totalText}”即可。

我希望这个Youtube链接也会对您有所帮助。

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

答案 3 :(得分:0)

使用“ notifyChange()”代替“ notifyPropertyChanged(BR ._)” ..!

答案 4 :(得分:0)

需要为2way数据绑定添加=

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

I forgot to add = so its not work
If you are using Edit text then want 2 way data binding by base BaseObservable then 

需要@ = {LoginViewModel.address}而不是“ @ {LoginViewModel.address}”