【问题标题】:ViewModel Observer not working when activity is backstackedViewModel Observer 在活动回退时不起作用
【发布时间】:2022-01-07 01:16:36
【问题描述】:

我有 2 项活动:

A:用于列出数组列表,

B:用于插入到数组列表中。

A 正在观察数组列表:

playlistItemsViewModel.playlistItems.observe(this, { playlistItems ->
        Log.i("Received playlistItems", playlistItems.size.toString())
        adapter = PlaylistItemAdapter(playlistItems)
        binding.rvPlaylistItems.adapter = adapter
})

A 也在观察何时添加了新项目:

playlistItemsViewModel.newItem.observe(this, { newItem ->
       Log.i("newItem >>>", newItem.toString())
       adapter.addPlaylistItem(newItem)
})

为了添加一个新项目,我启动了一个意图 B,playlistItemsViewModel.submitVideoItem(item) 在其中工作,但是活动 A 被暂停,因此它没有收到发布的值,当按下后退按钮并恢复 A 时,它仍然可以什么都收不到。

playlistItemsViewModel.submitVideoItem(item) 在 A 内部工作时,MutableLiveData newItem postValue 发布成功。基本上,当您在活动 B 中添加一个新的播放列表项时,它会插入到在堆栈中暂停的活动 A 上。

我错过了什么?

【问题讨论】:

  • “playlistItemsViewModel”在两个活动中是同一个实例吗?
  • @PangoSea 同一个类,我假设同一个实例但不太确定。每个都声明为private val playlistItemsViewModel: PlaylistItemsViewModel by viewModels()
  • 就是问题所在,两个activity之间的playlistItemsViewModel不是同一个实例。所以livedata对B的变化A是看不到的,最好使用startActivityForResult()和onActivityResult()。

标签: android kotlin mvvm


【解决方案1】:

我理解当 Activity B 为变量 newItem 插入一个新值时,当返回到 Activity A 时你想要更新它。

如果是我,我会使用 startActivityForResult()onActivityResult() 这会更合适。

https://developer.android.com/training/basics/intents/result

关于 LiveData,您可以在此处阅读以更好地了解您遇到的问题。

https://developer.android.com/topic/libraries/architecture/livedata

【讨论】:

    【解决方案2】:

    您不能在Activities 之间共享ViewModel 的相同实例,您只能在片段之间共享viewmodel,并且也可以通过 Activity 的 Context 共享。 (您可以通过在 A 和 B 的 Logs 中打印 viewmodel 对象来确认这一点,您将获得 2 个实例)

    这里的问题是你的活动 A 和 B 持有不同的 ViewModel 实例,所以它永远不会工作。

    对于解决方案,您可以切换到Fragments,或者如果它对您来说太多,那么可以转到ActivityResultApi

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-26
      • 1970-01-01
      • 2020-05-22
      • 2017-11-16
      • 2015-03-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多