Android: привязка данных, notifyPropertyChanged() не работает?

Я использую библиотеку привязки данных 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);

изменения не отражаются в текстовом представлении. В чем может быть проблема?

Ответ 1

Использование имени поля вместо получателя.

<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}"/>

Ответ 2

У меня была такая же проблема. Моя привязка будет работать в первый раз, а затем не будет работать во второй раз.

У меня была идентичная настройка для вас, за исключением того, что я наложил @Bindable на мой сеттер, а не на мой метод getter.

Добавление @Bindable как для моего сеттера, так и для getter исправил эту проблему для меня.

Когда я отлаживал внутренних работников библиотеки привязки данных, я заметил, что метод, называемый повторным связыванием запроса, не вызывался потому что он выполнил операцию, чтобы проверить, было ли поле обновлено или нет от последнего значения. Я предполагаю, что вам нужна аннотация для обоих методы, чтобы он мог сделать это внутреннее подтверждение, чтобы проверить, необходимо повторно связать или нет.

Я не 100%, если это правда или нет, но аннотация для обоих методов исправила мою проблему. Глядя на документацию библиотеки привязки данных, я замечаю, что они просто показывают аннотацию на получателе.

Вы можете попробовать:

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

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

Посмотрите, разрешит ли он это.

Ответ 3

Я думаю, что вы должны определить свои значения String как публичные, а не частные. Кроме того, dataBinding автоматически обнаруживает получатель и установщик, поэтому просто введите "@{object.totalText}", как уже говорилось.

Я надеюсь, что эта ссылка на YouTube будет вам полезна.

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

Ответ 4

Используйте "notifyChange()" вместо "notifyPropertyChanged (BR._)"..!

Ответ 5

Необходимо добавить = для 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}"