Итак, у меня есть viewHolder с флажком
вот моя модель представления
@Bindable
var itemIsSelected: Boolean = isSelected
set(value) {
if (field != value) {
field = value
notifyPropertyChanged(BR.itemIsSelected) // this doesn't work
notifyChange() // this one works
}
}
вот мой класс viewHolder
inner class SpecialityItemViewHolder(val binding: ItemSpecialityFilterBinding): RecyclerView.ViewHolder(binding.root) {
fun bind(specialityItemViewModel: SpecialityItemViewModel) {
binding.viewModel = specialityItemViewModel
binding.executePendingBindings()
this.itemView.setOnClickListener {
binding.viewModel?.let {
it.itemIsSelected = !it.itemIsSelected // this doesn't trigger ui changes
}
}
}
}
XML
<?xml version="1.0" encoding="utf-8"?>
<layout>
<data>
<variable
name="viewModel"
type="packagename.ItemViewModel" />
</data>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="@dimen/vertical_margin_small"
android:paddingBottom="@dimen/vertical_margin_small"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<Checkbox
android:id="@+id/checkbox"
android:layout_width="25dp"
android:layout_height="25dp"
android:checked="@={viewModel.itemIsSelected}"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"/>
</android.support.constraint.ConstraintLayout>
</layout>
, так что получается, что настройка работает должным образом, так как когда я нажимаю на флажок, она устанавливает поле поддержки на соответствующее значение
но когда я устанавливаю поле поддержки (код уведомления в функции привязки), это не вызывает изменения пользовательского интерфейса. Я знаю, что вызов binding.executePendingBindings () решит проблему, но я понимаю, что notifyPropertyChanged (BR.itemIsSelected) не должен вызывать executePendingBindings , На самом деле, если я вместо этого вызываю notifyChange, все работает правильно (но я предполагаю, что здесь есть проблема с производительностью, поскольку вместо этого она уведомляет об изменении для всех свойств)