如何将数据从 AutoCompleteTextView 传递给 ViewModel?
How to pass data to ViewModel from AutoCompleteTextView?
我需要将单击对象的 ID 从 AutoCompleteTextView 传递到 ViewModel。这里我有一个绑定适配器,用于为 AutoCompleteTextView 设置带有对象的微调器。
@BindingAdapter("bindAutocomplete")
fun bindAutocomplete(textView: AutoCompleteTextView, cities: List<City>?){
cities?.let {
val adapter = ArrayAdapter<City>(
textView.context,
R.layout.support_simple_spinner_dropdown_item,
it)
textView.setAdapter(adapter)
}
}
我的问题是:我应该将 OnItemClickListener 放在哪里,是在上面的这个适配器中,还是在下面的代码中的 Fragment class 中?
第一种方法的问题是我不知道如何从绑定适配器访问我的 ViewModel。其次,如果我将此侦听器放在片段中 class 是不是打破了一种模式,因为 Biniding Adapter 和 OnItemClickListener 的初始化不同步?
所以我需要将 city.id 传递给 ViewModel 中的某个方法。
binding.autoCompleteTextView.setOnItemClickListener { parent, view, position, id ->
val city = parent.adapter.getItem(position) as City
binding.viewModel.getWeatherProperties(city.id)
}
您可以使用如下两种方式的数据绑定将数据传递给 viewmodel..
<AutoCompleteTextView
android:id="@+id/autoCompleteTextView"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:layout_marginLeft="92dp"
android:layout_marginTop="144dp"
android:text="@={viewmodel.rememberMe}"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
因此,我仅通过使用 Observer 就解决了这个任务,我不确定是否可以在这里使用与 AutoCompleteTextView 的双向绑定。可能是因为 SetOnItemClickListener 没有对双向数据绑定的内置支持。
viewModel.autocompleteArray.observe(viewLifecycleOwner, Observer {
it?.let {
val adapter = ArrayAdapter<City>(
binding.autoCompleteTextView.context,
R.layout.support_simple_spinner_dropdown_item,
it)
binding.autoCompleteTextView.setAdapter(adapter)
binding.autoCompleteTextView.setOnItemClickListener { parent, view,
position, id ->
val s = parent.adapter.getItem(position) as City
viewModel.getWeatherProperties(s.id)
}
}
})
我需要将单击对象的 ID 从 AutoCompleteTextView 传递到 ViewModel。这里我有一个绑定适配器,用于为 AutoCompleteTextView 设置带有对象的微调器。
@BindingAdapter("bindAutocomplete")
fun bindAutocomplete(textView: AutoCompleteTextView, cities: List<City>?){
cities?.let {
val adapter = ArrayAdapter<City>(
textView.context,
R.layout.support_simple_spinner_dropdown_item,
it)
textView.setAdapter(adapter)
}
}
我的问题是:我应该将 OnItemClickListener 放在哪里,是在上面的这个适配器中,还是在下面的代码中的 Fragment class 中?
第一种方法的问题是我不知道如何从绑定适配器访问我的 ViewModel。其次,如果我将此侦听器放在片段中 class 是不是打破了一种模式,因为 Biniding Adapter 和 OnItemClickListener 的初始化不同步?
所以我需要将 city.id 传递给 ViewModel 中的某个方法。
binding.autoCompleteTextView.setOnItemClickListener { parent, view, position, id ->
val city = parent.adapter.getItem(position) as City
binding.viewModel.getWeatherProperties(city.id)
}
您可以使用如下两种方式的数据绑定将数据传递给 viewmodel..
<AutoCompleteTextView
android:id="@+id/autoCompleteTextView"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:layout_marginLeft="92dp"
android:layout_marginTop="144dp"
android:text="@={viewmodel.rememberMe}"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
因此,我仅通过使用 Observer 就解决了这个任务,我不确定是否可以在这里使用与 AutoCompleteTextView 的双向绑定。可能是因为 SetOnItemClickListener 没有对双向数据绑定的内置支持。
viewModel.autocompleteArray.observe(viewLifecycleOwner, Observer {
it?.let {
val adapter = ArrayAdapter<City>(
binding.autoCompleteTextView.context,
R.layout.support_simple_spinner_dropdown_item,
it)
binding.autoCompleteTextView.setAdapter(adapter)
binding.autoCompleteTextView.setOnItemClickListener { parent, view,
position, id ->
val s = parent.adapter.getItem(position) as City
viewModel.getWeatherProperties(s.id)
}
}
})