Как передать выбранный элемент в viewmodel, который наблюдает другое значение?

#android #kotlin #viewmodel #observer-pattern

#Android #kotlin #viewmodel #наблюдатель-шаблон

Вопрос:

Когда я нажимаю на представление, оно изменяет X, который наблюдается во фрагменте. Мне нужно передать выбранный вид в метод viewmodel.X.observe() . Я не могу установить viewmodel.X.observe внутри OnItemClickListener, поскольку он будет пытаться создавать нового наблюдателя при каждом нажатии на элемент. Каков наилучший способ передать выбранный элемент в метод viewmodel.observe? Создается ли глобальная переменная для хранения только выбранного элемента?

Фрагмент кода:

 lateinit var viewClicked: View
val itemClickListener =
        (object : OnItemClickListener<View> {
            override fun onItemClicked(item: View) {
                viewClicked = item
                //do something else
            }
        })

viewModel.signalStatus.observe(viewLifecycleOwner, {
        //Is viewClicked global my only option to be able to access here?
        // I can't have this observer inside my click listener as it will trigger this multiple times when user clicks on view
        if (viewClicked == btnView) {
            //do something
        } 
    })
 

Комментарии:

1. ViewModel не должен содержать представление. Перед использованием ViewModels лучше узнать больше об архитектуре MVVM . или посмотрите несколько серий на YouTube.

2. @MRazaImtiaz приведенный выше код находится во фрагменте, а не в viewmodel.

3. Вы не можете этого сделать, чего вы хотите достичь, передавая представление? Обычный способ — наблюдать X и с помощью прослушивателя щелчков изменять значение X, после observe block чего будет выполнен код внутри

4. возможно, вы можете попробовать функцию обратного вызова интерфейса

Ответ №1:

Да, глобальная переменная. Или сгруппируйте их в массив, вместо этого передайте индекс.