Как передать данные в ViewModel из AutoCompleteTextView? - PullRequest
0 голосов
/ 18 апреля 2020

Мне нужно передать идентификатор кликаемого объекта из 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, как в коде ниже?

Проблема первого способа заключается в том, что я не знаю, как получить доступ к моей ViewModel из Binding Adapter. И, во-вторых, если я помещу этот слушатель в класс Fragment, это не нарушит шаблон, потому что инициализация Biniding Adapter и OnItemClickListener не синхронизируется?

Так что мне нужно передать город. идентификатор некоторого метода в моей ViewModel.

binding.autoCompleteTextView.setOnItemClickListener { parent, view, position, id ->
        val city = parent.adapter.getItem(position) as City
        binding.viewModel.getWeatherProperties(city.id)
}    

Ответы [ 2 ]

0 голосов
/ 19 апреля 2020

Итак, я решил эту задачу, просто используя 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)
                    }
                }
            })
0 голосов
/ 18 апреля 2020

Вы можете использовать двустороннюю привязку данных, как показано ниже, для передачи данных в 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" />  
...