首页 > 解决方案 > Spinner 选定项的两种方式数据绑定

问题描述

我有一个视图模型,它有一个字段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"/>

但我收到错误我该如何解决这个问题

标签: androidandroid-studioandroid-spinnerandroid-databinding

解决方案


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
}

推荐阅读