android - 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"/>
但我收到错误我该如何解决这个问题
解决方案
在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
}
推荐阅读
- java - 在数组中,对于所有元素,如何找出数组中的每个元素是否存在 n-1 或 n+1?
- angularjs - 为什么firebase实时数据库的响应不能反映到angularjs中的html
- wpf - 有时会为 WPF MediaKit 触发 MediaFailed 事件
- json - 在 json 字符串中为 ctrl-char 添加转义字符
- jenkins - 并行示例 Jenkinsfile 声明性管道失败
- c++ - 在 C++ 中递归地使用参数包
- php - 使用 laravel 作为后端 API 和 AngularJS 作为前端的实时通知
- bigdata - 如何在 Excel 中连接 Kyvos Cube(Bigdata Cube)?
- entity - 在 Luis 上添加的实体值消失了
- javascript - 正则表达式模式匹配字符串,如“查看 1 到 10 的 100”