【问题标题】:How to pass clicked item to a viewmodel that is observing another value?如何将点击的项目传递给观察另一个值的视图模型?
【发布时间】:2020-12-17 06:08:12
【问题描述】:

当我点击一个视图时,它会修改在 Fragment 中观察到的 X。我需要将点击的视图传递给 viewmodel.X.observe() 方法。我无法在 OnItemClickListener 中设置 viewmodel.X.observe,因为它会在每次单击项目时尝试创建新的观察者。将单击的项目传递给 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
        } 
    })

【问题讨论】:

  • ViewModel 不应该持有视图。在使用 ViewModel 之前,最好了解更多关于 MVVM architecture 的信息。或在 youtube 上观看一些连续剧。
  • @MRazaImtiaz 上面的代码在片段而不是视图模型中。
  • 你不能那样做,你想通过视图达到什么目的?通常的方法是观察 X 并通过点击监听器更改 X 的值,然后 observe block 中的代码将被执行
  • 你可以试试接口回调函数

标签: android kotlin viewmodel observer-pattern


【解决方案1】:

是的,全局变量。 或者将它们分组到数组中,而不是传递索引。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-21
    • 1970-01-01
    • 1970-01-01
    • 2013-09-23
    • 1970-01-01
    相关资源
    最近更新 更多