观察一个MutableLiveData列表

8

我正在使用LiveData技术在我的应用程序中,我有一个继承自ViewModel的视图模型。

在我的视图模型中,我有一个列表:

var songs: MutableLiveData<List<Song>> = MutableLiveData<List<Song>>()

在我的视图模型中的一个函数中,我做了以下操作:
 songs.value?.find { it.id == song.id }.also {

                when (song.isFavorite) {
                    true -> song.isFavorite = false
                    false -> song.isFavorite = true
                }
            }

我将更改 songs 中一个项目中的布尔值,并且在我的片段中,我会像下面这样观察这个列表:

viewModel.songs.observe(this , Observer {

            Log.d(TAG , "songs changed")

        })

但是在这个更改之后,歌曲将不会通知。

为什么会发生这样的情况?

感谢你的回答。


这是因为你正在观察你的列表,而不是你的列表项。 - kartik malik
如果您想在视图中更新“收藏”状态,则可以将“收藏”变量设置为“MutableLiveData”并将其与视图绑定。每当“收藏”变量有新值时,视图都会得到更新。 - kartik malik
1个回答

10

LiveData的工作原理是,当LiveData的值发生变化时,它会通知相关方,例如:

假设您有一个歌曲数据类:

data class Song(name : String?)

在 ViewModel 中:

val songLiveData = MutableLiveData<Song?>
在您的活动中:
viewModel.songLiveData.observe(this , Observer {

        Log.d(TAG , "songs changed")

    })
songLiveData.value = Song(name = "Name of Song")

这将有效。

当您调用 LiveData 的setValue方法时,回调会传递给观察者。

private val songsLiveData = MutableLiveData<List<Song?>>()

init {
   songsLiveData.value = ArrayList()
}

fun editSong() {
    //change all the things in you live data
    songsLiveData.value = songsLiveData.value//this will give the callback to you observer
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接