Обновление данных Android MVVM

#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», а затем в базе данных порядок обновляется. Если я перезагружу фрагмент, порядок объектов с продуктами изменится. Но пользовательский интерфейс не реагирует на изменение в базе данных непосредственно после события.