【问题标题】:How to communicate from Fragment to ViewModel?如何从 Fragment 到 ViewModel 进行通信?
【发布时间】:2020-01-06 02:57:52
【问题描述】:

我目前有一个在 MainActivity 中实现的接口,它允许与 NumberFragment 进行通信。 onCountClickedNumberFragment 中的方法,用于接收项目点击的 id。

问题

如何在每次单击项目时将 onCountClicked 位置发送到 NumberFragmentViewModel

注意:使用数据绑定和recycleview

主要活动

  val newFragment = NumberFragment()
                 val args = Bundle()
                 args.putInt(NumberFragment().onCountClicked(data).toString(),data.toInt())

                newFragment.arguments = args

数字片段

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                              savedInstanceState: Bundle?): View? {
 val sleepTrackerViewModel =
            ViewModelProviders.of(
                    this, viewModelFactory).get(NumberViewModel::class.java)

    setHasOptionsMenu(true)

    binding.setLifecycleOwner(this)

    binding.sleepTrackerViewModel = sleepTrackerViewModel

    //Observes for any changes on database and updates the UI
    sleepTrackerViewModel.dbCount.observe(this, Observer {dbCount ->
        dbView.text = dbCount.number.toString()
    })
    return binding.root
}

   fun onCountClicked(position: Long) {
        Log.i("NumberF" , "------------->" + position)
    }

【问题讨论】:

    标签: android android-fragments kotlin android-viewmodel


    【解决方案1】:

    您可以简单地在 viewModel 中创建一个方法来接收该位置并更新实时数据的值。我会这样做:

    private val _idItemClicked = MutableLiveData<Int>()
    val idItemClicked: LiveData<Int> = _idItemClicked
    
    fun setIdItemClicked(id: Int) {
       _idItemClicked.value = id
    }
    
    

    现在您调用函数 setIdItemClicked 来设置新值。

    【讨论】:

    • 谢谢!所以一旦我在 viewModel 上收到这个。如何将实时数据转换为整数?我需要指定要获取哪个项目 ID 的 DAO。
    • 我不知道你的整个视图模型看起来如何,但你不一定需要为类型化的 MutableLiveData 制作 _idItemClicked。如果您不想为其设置观察者,只需将其设为 Int 类型,删除 idItemClicked 变量并在函数中写入 _idItemClicked = id。
    • 我尝试将其作为 lateinit 变量执行,但会得到“尚未初始化”。如果我将变量初始化为 0,则变量在单击时永远不会更改。我不知道该怎么办。
    • 我完全不知道如何帮助您,因为我不太了解您的视图模型中发生的逻辑。也许你应该编辑你的第一篇文章并在那里粘贴一些代码。但是你也可以让 Int 类型的 _idItemClicked ?并用 null 初始化。然后,每次使用它时,都应该检查它是否为空。如果它为空,则应该使用它。如果您将其声明为 lateinit,那么您还应该在使用它之前检查它是否已初始化。使用 if(!::_idItemClicked.isInitialized)
    • 谢谢,我找到了一种使用 SharedViewModel 的方法。我将在这里发布我的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多