除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}。
有想法吗?