RecyclerView中的数据绑定微调器

时间:2019-10-07 06:54:20

标签: android mvvm android-databinding

除Spinner之外,我目前在数据绑定方面取得了成功,我目前正在尝试使其工作。但是我收到如下错误消息:

  

找不到用于接受参数类型'java.lang.String'的吸气剂-如果我   只需使用@ = {}

而且,找不到以下设置器:

  接受的

  参数类型'androidx.lifecycle.MutableLiveData'   -如果我只使用@ {}

我不确定什么是正确的方法。我读过一些文章,您需要创建一个具有这些设置器/获取器的自定义Widget?我认为声明BindingAdapter和InverseBindingAdapter就足够了,但是我得到了这些编译错误消息。

这是我的代码:

<androidx.appcompat.widget.AppCompatSpinner
            android:id="@+id/input_email_type"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:entries="@array/email_phone_types"
            android:spinnerMode="dialog"
            android:theme="@style/AppTheme.Light"
            app:newValue="@={email.emailType}"/>

标记中的android:entries是来自arrays.xml的[“ Home”,“ Work”]。

@BindingAdapter(value = ["newValue", "newValueAttrChanged"], requireAll = false)
fun setNewValue(spinner: AppCompatSpinner, emailType: MutableLiveData<String>, changeListener: InverseBindingListener) {
    spinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
        override fun onItemSelected(adapterView: AdapterView<*>, view: View, position: Int, id: Long) = changeListener.onChange()
        override fun onNothingSelected(adapterView: AdapterView<*>) = changeListener.onChange()
    }

    val adapter: ArrayAdapter<String> = spinner.adapter as ArrayAdapter<String>
    spinner.setSelection(adapter.getPosition(emailType.value))
}

@InverseBindingAdapter(attribute = "newValue", event = "newValueAttrChanged")
fun getNewValue(spinner: AppCompatSpinner): String = spinner.selectedItem as String

fun add() {
    emails!!.add(Email())
    notifyItemInserted(emails!!.size - 1)
}

代码在我的自定义RecyclerView.Adapter类中,而email是Email类。而emailType是类型为MutableLiveData的Email的属性

微调器位于RecyclerView的每一行中。而我为@ 2数据绑定指定了@ = {email.emailType}。

有想法吗?

0 个答案:

没有答案