двусторонняя привязка данных не работает должным образом в окне просмотра - PullRequest
0 голосов
/ 01 ноября 2018

Итак, у меня есть 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, все работает правильно (но я предполагаю, что здесь есть проблема с производительностью, поскольку вместо этого она уведомляет об изменении для всех свойств)

Ответы [ 2 ]

0 голосов
/ 10 ноября 2018

модель представления нуждается в аннотациях Kotlin, иначе процессор аннотаций проигнорирует это:

class ViewModel : BaseObservable() {

    @get:Bindable
    var isSelected: Boolean
        set(value) {
            if (isSelected != value) {
                isSelected = value
                notifyPropertyChanged(BR.isSelected)
            }
        }
}

it.isSelected легче читать, чем it.itemIsSelected.

0 голосов
/ 08 ноября 2018

Ваш класс ViewModel должен расширять класс BaseObservable, а используя kotlin, вы должны использовать аннотацию @get:Bindable. Если вы не хотите использовать BaseObservable в качестве родительского класса, используйте ObservableField<Boolean>(). Вы найдете больше информации в https://developer.android.com/topic/libraries/data-binding/observability#kotlin

...