#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