问题描述
我在使用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>>
,则它将相应地自动更新。