更新数据 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。
我在使用架构 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。