#java #android-room #android-mvvm
#java #android-комната #android-mvvm
Вопрос:
Я работаю в приложении, использующем архитектуру MVVM, и я немного смущен тем, как лучше всего, когда вам нужно обновить или вставить данные из события, например, при нажатии кнопки.
У меня есть это в наблюдателях suscribe, чтобы отслеживать изменения, и это хорошо работает, когда я открываю фрагмент после добавления продуктов и заказа:
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);
}
Но я думаю, что это должен быть лучший способ, потому что фрагмент автоматически не обновляет данные из фрагмента.
После обновления этого адаптер должен измениться.
Ответ №1:
Попробуйте
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);
}
Если исходные LiveData, предоставленные из getOrderWithProducts()
, поступают из Room DAO as LiveData<List<T>>
, то они будут автоматически обновлены соответствующим образом.
Комментарии:
1. Я вношу изменения, и обновление хорошо работает в базе данных, но пользовательский интерфейс не изменяет информацию. Исходные живые данные получены из этого: final LiveData<Resource<OrderWithProducts>> repositorySource = pedidoRepository.searchOrderWithProducts();
2. Тогда, похоже, ваша реализация репозитория неверна.
3. У меня это происходит при обновлении. AppExecutors.getInstance().DiskIO().execute(new Runnable() { @Override public void run() { OrderDAO.updateConfir(idOrder); } }); И в DAO у меня есть этот @Query(«ПОДТВЕРЖДЕНИЕ УСТАНОВЛЕННОГО порядка ОБНОВЛЕНИЯ = 1, ГДЕ id = :idOrder») аннулирует updateConfirm(int idOrder);
4. Хорошо, но мне нужно знать о вашем запросе: p
5. Извините, трудно объяснить в комментарии, когда я нажимаю кнопку, запускается метод «UpdateOrder», а затем в базе данных порядок обновляется. Если я перезагружу фрагмент, порядок объектов с продуктами изменится. Но пользовательский интерфейс не реагирует на изменение в базе данных непосредственно после события.