Двухсторонняя привязка данных для выбранного элемента прядильщика - PullRequest
0 голосов
/ 07 января 2020

У меня есть представление Модель, которое имеет поле district, которое является типом MutableLiveData<String> Я инициализировал его с var district = MutableLiveData<String>("") Я хочу привязать к нему выбранный элемент, для этого у меня есть BindingClass

object SpinnerBindingUtil {
        @BindingAdapter(value = ["selectedValue", "selectedValueAttrChanged"], requireAll = false)
        fun bindSpinnerData(
        pAppCompatSpinner: Spinner,
        newSelectedValue: String,
        newTextAttrChanged: InverseBindingListener
        ) {
    pAppCompatSpinner.onItemSelectedListener = object : OnItemSelectedListener {
        override fun onItemSelected(
            parent: AdapterView<*>?,
            view: View,
            position: Int,
            id: Long
        ) {
            newTextAttrChanged.onChange()
        }

        override fun onNothingSelected(parent: AdapterView<*>?) {}
    }
    if (newSelectedValue != null) {
        val pos =
            (pAppCompatSpinner.adapter as ArrayAdapter<String?>).getPosition(
                newSelectedValue
            )
        pAppCompatSpinner.setSelection(pos, true)
    }
}

@InverseBindingAdapter(attribute = "selectedValue", event = "selectedValueAttrChanged")
fun captureSelectedValue(pAppCompatSpinner: AppCompatSpinner): String {
    return pAppCompatSpinner.selectedItem as String
}

}

и вот мой xml

                    <Spinner
                    selectedValue="@= 
                    {addConsumerViewModel.district}"
                    android:entries="@array/districts"
                    android:id="@+id/districtSpinner"
                    style="@style/AddConsumerSpinner"/>

но я получаю ошибку, как я могу решить эту проблему

1 Ответ

0 голосов
/ 07 января 2020

В kotlin вы должны использовать kapt для правильной работы с привязкой данных. В вашем модуле уровня build.gradle примените этот плагин.

apply plugin: 'kotlin-kapt'

После этого вы, вероятно, столкнетесь с ошибкой : ожидаются проблемы . Затем сделайте свой адаптер привязки как простой kt файл, удалив object SpinnerBindingUtil {}:

@BindingAdapter(value = ["selectedValue", "selectedValueAttrChanged"], requireAll = false)
fun bindSpinnerData(
    pAppCompatSpinner: Spinner,
    newSelectedValue: String,
    newTextAttrChanged: InverseBindingListener
) {
    pAppCompatSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
        override fun onItemSelected(
            parent: AdapterView<*>?,
            view: View,
            position: Int,
            id: Long
        ) {
            newTextAttrChanged.onChange()
        }

        override fun onNothingSelected(parent: AdapterView<*>?) {}
    }
    if (newSelectedValue != null) {
        val pos =
            (pAppCompatSpinner.adapter as ArrayAdapter<String?>).getPosition(
                newSelectedValue
            )
        pAppCompatSpinner.setSelection(pos, true)
    }
}

@InverseBindingAdapter(attribute = "selectedValue", event = "selectedValueAttrChanged")
fun captureSelectedValue(pAppCompatSpinner: AppCompatSpinner): String {
    return pAppCompatSpinner.selectedItem as String
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...