У меня был успех с привязкой данных, за исключением Spinner, который я сейчас пытаюсь заставить его работать. Но я получаю сообщения об ошибках типа:
Не удается найти метод получения, который принимает тип параметра 'java.lang.String' - если я просто использую @ = {}
И, Не могу найти установщик для:
, который принимает тип параметра 'androidx.lifecycle.MutableLiveData' - если я просто использую @ {}
, я не уверен, чтоправильный подход. Я читал в некоторых сообщениях, что вам нужно создать собственный виджет, который имеет эти сеттер / геттер? Я думал, что объявления 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: записи в теге: ["Home",«Работа»] из файла arrays.xml.
@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, а электронная почта является классом электронной почты. в то время как emailType является свойством Email типа MutableLiveData
Спиннер находится в каждой строке в RecyclerView. и я назначил @ = {email.emailType} для двухсторонней привязки данных.
Мысли?