更新数据 Android MVVM

Updating data Android MVVM

我在使用架构 MVVM 的应用程序中工作,当您需要更新或插入来自事件的数据时(例如单击按钮时),我有点困惑它是最好的方法。

我在 suscribe Observers 中有此功能以跟踪更改,当我在添加产品并订购后打开片段时效果很好:

     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 来自 Room DAO 作为 LiveData<List<T>>,那么它将相应地 auto-update。