-1

I'm trying to create a two-way data binding on a Switch component, using MVVM and LiveData, but I always receive a

error: cannot find symbol

on DataBinderMapperImpl.java, and also i have:

A failure occurred while executing org.jetbrains.kotlin.gradle.internal.KaptExecution

Any help? Thanks

The property in the ViewModel

private val _numbers = MutableLiveData<Boolean>()
val numbers: LiveData<Boolean>
    get() = _numbers

BindingAdapter

@BindingAdapter("numberSwitchAttrChanged")
fun setListeners(view: CompoundButton, attrChange: InverseBindingListener) {
    view.setOnCheckedChangeListener { _, _ -> attrChange.onChange() }
}

@BindingAdapter("numbersSwitch")
fun setNumbersSwitch(view: CompoundButton, isChecked: Boolean) {
    if (view.isChecked != isChecked) {
        view.isChecked = isChecked
    }
}

@InverseBindingAdapter(attribute = "numbersSwitch")
fun getNumbersSwitch(view: CompoundButton): Boolean {
    return view.isChecked
}

XML

<Switch
    android:id="@+id/numbersSwitch"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="24dp"
    app:numbersSwitch="@={viewModel.numbers}"
    app:layout_constraintEnd_toStartOf="@+id/guideline3"                
    app:layout_constraintLeft_toRightOf="@+id/lengthText"                
    app:layout_constraintTop_toBottomOf="@+id/lengthText" />
Barros
  • 84
  • 1
  • 6
  • 1
    the `numbers` get() method returns an immutable `LiveData` object, just relax the visibility of `private val _numbers = MutableLiveData()` to `val numbers = MutableLiveData()` (possibly with a start value) - for 2 way data binding to work it must be mutable by the client as well – Mark May 30 '20 at 15:54

1 Answers1

0

I resolved whit added onCheckedChanged property on XML

<Switch
    android:id="@+id/numbersSwitch"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="24dp"
    android:checked="@{viewModel.numbersSwitch}"
    android:onCheckedChanged="@{(button, on)-> viewModel.setNumbersSwitch(on)}"
    app:layout_constraintEnd_toStartOf="@+id/guideline3"                
    app:layout_constraintLeft_toRightOf="@+id/lengthText"                
    app:layout_constraintTop_toBottomOf="@+id/lengthText" />

and define the function setNumbersSwitch in ViewModel and removed BindingAdapter

fun setNumbersSwitch(isChecked: Boolean) {
    when (isChecked) {
        true -> _numbersSwitch.value = true
        false -> _numbersSwitch.value = false
    }
}
Barros
  • 84
  • 1
  • 6