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