gpt4 book ai didi

android - 当 View 模型中更新另一个 LiveData 时触发 LiveData 成员的更新

转载 作者:行者123 更新时间:2023-11-30 05:10:48 27 4
gpt4 key购买 nike

在文字游戏应用中,我在 Activity 和 fragment 之间共享一个模型:

public class MainViewModel extends AndroidViewModel {
private LiveData<List<Game>> mGames;
private final MutableLiveData<Game> mDisplayedGame = new MutableLiveData<>();

(请原谅截图中的非英文文字)

activity and fragment

Activity 观察用户当前正在玩的 mGames 并更新抽屉导航菜单(请参见上面屏幕截图的左侧)。

fragment 观察 mDisplayedGame 并将其显示在自定义 View 中(请参见上面屏幕截图的右侧)。

我的问题是,当游戏列表在服务器上更新时( Activity 通过 Websocket 接收新的游戏列表并将其存储在房间中),我需要发布更新到 fragment :“嘿,你正在显示的游戏已更新,重新绘制它!”

是否可以从共享 View 模型中做到这一点?

我知道我也可以在 fragment 中观察 mGames 并在那里添加一个代码来遍历它们,然后查明显示的游戏是否在服务器上更新了。

但我更愿意在 MainViewModel 中执行此操作,因为我觉得 fragment 应该只观察它正在显示的一个游戏,仅此而已。

长话短说

每当通过 Room 在 View 模型中更新 mGames 时,我也需要通知 mDisplayedGame 观察者!

最佳答案

您应该为此使用 MediatorLiveData。

它的工作方式是这样的

public class MainViewModel extends AndroidViewModel {
private final LiveData<List<Game>> mGames;
private final MutableLiveData<Game> mSelectedGame = new MutableLiveData<>();

private final MediatorLiveData<Game> mDisplayedGame = new MediatorLiveData<>();

{
mDisplayedGame.addSource(mGames, (data) -> {
// find the new value of the selected game in the list
mSelectedGame.setValue(newSelectedGame);
});

mDisplayedGame.addSource(mSelectedGame, (data) -> {
mDisplayedGame.setValue(data);
});
}

然后你公开mDisplayedGame作为LiveData<Game>它应该可以正常工作。

关于android - 当 View 模型中更新另一个 LiveData 时触发 LiveData 成员的更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53792203/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com