更新数据Android MVVM

问题描述

我在使用MVVM体系结构的应用程序中工作,对于需要更新或插入事件(例如单击按钮)的最佳方式,我有些困惑。

我在suscribe观察员中拥有此功能来跟踪更改,并且在将Products添加到并订购后打开片段时,此功能很好地工作:

     shopViewModel.getOrderWithProducts().observe(getViewLifecycleOwner(),new Observer<Resource<OrderWithProducts>>() {
        @Override
        public void onChanged(Resource<OrderWithProducts> pedidoResource) {
            if (pedidoResource != null) {
                Log.d(TAG,"onChanged: status: " + pedidoResource.status);
                switch (pedidoResource.status) {
                    case LOADING: {
                        adapterPedido.displayLoading();
                        break;
                    }
                    case ERROR: {
                        adapterPedido.hideLoading();
                        if(pedidoResource.data != null) adapterPedido.setList(pedidoResource.data);
                        break;
                    }
                    case SUCCESS: {
                        if (pedidoResource.data != null) {
                            adapterPedido.hideLoading();
                            adapterPedido.setList(pedidoResource.data);
                        break;
                    }
                }
            }

        }
    });
}

要更新订单,我可以这样做:

 public void updateOrder() {
    pedidoRepository.setOrderConfirm(OrderWithProducts.getValue().data.getPedido().getId());
    pedidoConProductos.getValue().data.getPedido().setConfirmado(true);
}

但是我认为这必须是一个更好的方法,因为Fragment不会自动更新Fragment中的数据。 更新后,适配器应该更改。

解决方法

尝试

     shopViewModel.getOrderWithProducts().observe(getViewLifecycleOwner(),new Observer<List<OrderWithProducts>>() {
        @Override
        public void onChanged(List<OrderWithProducts> data) {
            adapterPedido.setList(data);
        }
    });

     shopViewModel.isLoading().observe(getViewLifecycleOwner(),new Observer<Boolean>() {
        @Override
        public void onChanged(Boolean isLoading) {
            if(isLoading) {
                adapterPedido.displayLoading();
            } else {
                adapterPedido.hideLoading();
            }
        }
    });

 public void updateOrder() {
    pedidoRepository.setOrderConfirm(OrderWithProducts.getValue().data.getPedido().getId());
    // pedidoConProductos.getValue().data.getPedido().setConfirmado(true);
}

如果getOrderWithProducts()提供的原始LiveData来自房间DAO,LiveData<List<T>>,则它将相应地自动更新。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...