Обновление атрибута пользовательского интерфейса с помощью привязки данных в Android

#android

#Android

Вопрос:

Я просматриваю документы Android по привязке данных и опробовал следующий код:

 data class User(var firstName: String, var lastName: String)

val binding: ActivityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main)

val user = User("Steve", "Jobs")
binding.user = user

btn_change_firstname.setOnClickListener {
    user.firstName = "John"
}
  

Текстовое представление будет обновлено именем и фамилией. Но когда я добавляю кнопку, а затем меняю имя, текстовое представление, отображающее имя, не обновляется. Есть ли что-то еще, что я должен сделать, чтобы это сработало?

Ответ №1:

это ожидаемое поведение. Либо вы переносите firstName / lastName в ObservableField , либо начинаете использовать LiveData .

Документацию для ObservableField можно найти в нем. Конечно, вам придется изменить свой прослушиватель нажатия кнопки следующим образом

 btn_change_firstname.setOnClickListener {
    user.firstName.set("John")
}
  

где FirstName объявляется как val firstName: ObservableField<String> .

В этом случае Android будет отслеживать изменения в самом поле

Другой способ заключается в создании подкласса BaseObservable и вызове notifyProperyChanged(поле int). НАПРИМЕР.

 class User: BaseObservable() {

  var firstName: String = ""
     set(newValue) {
        field = newValue
        notifyProperyChanged(BR.firstName)
     }
}
  

Комментарии:

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

2. другой способ — создать подкласс BaseObservable и вызвать notifyPropertyChanged(int fieldId) после установки нового значения

Ответ №2:

в вашем макете добавьте

 <TextView
android:text="@{user.firstName}" />
  

Комментарии:

1. У меня это уже есть. Я разместил это здесь не для того, чтобы сделать все короче и приятнее.

2. Затем вам следует попробовать ObservableField или LiveData