代码之家  ›  专栏  ›  技术社区  ›  Alexander Farber

在视图模型中更新另一个LiveData时触发LiveData成员的更新

  •  1
  • Alexander Farber  · 技术社区  · 7 年前

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

    (请原谅屏幕截图中的非英语文本)

    activity and fragment

    观察 mGames

    碎片 观察 mDisplayedGame 并在自定义视图中显示(请参见上面屏幕截图的右侧)。

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

    是否可以从共享视图模型中执行此操作?

    我知道我可以观察 姆加姆斯 在片段中也添加一个代码,在其中迭代,然后找出显示的游戏是否在服务器上更新。

    但我更愿意在晚上做 MainViewModel

    TL;博士

    无论何时 通过房间在视图模型中更新,我需要通知 MDisplayedName

    2 回复  |  直到 7 年前
        1
  •  3
  •   EpicPandaForce Jigar Joshi    7 年前

    为此,您应该使用中介LiveData。

    它的工作原理是

    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> 而且它应该会起作用。

        2
  •  -2
  •   VÅ© Hồng SÆ¡n    7 年前

    使用回调bro -在viewmodel中添加回调接口和setCallback方法 -让片段实现它,然后调用viewmodel.setCallback(片段)