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);

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


person Ashwin    schedule 15.12.2015    source источник
comment
не могли бы вы решить вашу проблему, сэр?   -  person mahdi pishguy    schedule 29.09.2016
comment
@mahdipishguy: Нет, сэр. Проблема еще не решена   -  person Ashwin    schedule 29.09.2016


Ответы (5)


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

<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}"/>
person LenaYan    schedule 18.01.2016
comment
кажется неправильным, вы должны использовать класс BR для идентификации поля И иметь как установщик, так и получатель, аннотированные с помощью @Bindable - person LambergaR; 29.01.2018

Необходимо добавить = для двусторонней привязки данных:

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

Я забыл добавить =, так что это не сработало. Если вы используете EditText, тогда вам нужна двусторонняя привязка данных по базе BaseObservable, тогда вам понадобится @={LoginViewModel.address} вместо @{LoginViewModel.address}.

person krishan mohan verma    schedule 13.07.2019
comment
Это сработало на мне Спасибо :) - person NehaK; 12.06.2020

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

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

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

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

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

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

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

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

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

person Dave Thomas    schedule 27.11.2017

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

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

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

person 정형식    schedule 03.08.2018

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

person Asim Hussain    schedule 21.10.2018
comment
пожалуйста, удалите свой комментарий, notifyPropertyChanged работает для привязки данных - person Gustavo Forero Carvajal; 06.04.2020