ViewModel не обновляется после переключения фрагментов - PullRequest
0 голосов
/ 09 мая 2019

Предположим, что нижняя панель навигации имеет два фрагмента, то есть HOME & CART. Во фрагменте CART показан список элементов (скажем, 5 элементов), и пользователь может удалить из него любые элементы. Если пользователь удаляет 2 элемента с помощью веб-запроса «Опубликовать / Удалить», он работает, как ожидается, и ответ с новым списком возвращается и обновляется. Все хорошо, пока здесь. Корзина обновляется как положено и на данный момент содержит 3 товара. Теперь, если пользователь переключается на фрагмент HOME и нажимает обратно фрагмент CART, он покажет 5 элементов, как показано в начале. Что здесь не так, почему ViewModel не обновляется после возвращения из фрагмента HOME, а сначала обновляется из CART?

На данный момент я не использую Шаблон репозитория и не включаю базу данных Room, что не требуется в моем сценарии. Просто нужно сделать веб-запрос с новыми данными и соответствующим образом обновить его.

Ниже приведен фрагмент и код ViewModel, с которым я работаю.

 public class MyCart extends DashBoardFragment implements UpdateItemListener {

    View view;
    private CartViewModel cartViewModel;
    Cart_Adapter adapter;
    List<Detail> adapterList = new ArrayList<>();

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    public MyCart() {
        // Required empty public constructor
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        view = inflater.inflate(R.layout.cart_screen, container, false);
        return view;
    }

    @Override
    public void onResume() {
        super.onResume();
        Timber.e("%s onResume called", TAG);
        unbinder = ButterKnife.bind(this, view);
        cartViewModel = ViewModelProviders.of(getActivity()).get(CartViewModel.class);
        layoutManager = new LinearLayoutManager(getActivity());
        recyclerView.setLayoutManager(layoutManager);
        adapter = new Cart_Adapter(adapterList);
        recyclerView.setItemAnimator(new DefaultItemAnimator());
        recyclerView.setAdapter(adapter);
        adapter.setOnItemClickListener(this);

        mActivity.showLoading();
        cartViewModel.getCart().observe(this, new Observer<ResponseWrapper<Cart>>() {
            @Override
            public void onChanged(ResponseWrapper<Cart> carts) {
                Timber.e("getCart onChanged Called");
                mActivity.hideLoading();
                if (carts.getErrorString() != null) {
                    mActivity.showErrorDialog(carts.getErrorString());
                } else {
                    Cart cart = carts.getResponse();
                    if (cart.getData().getDetail().size() > 0) {
                       mActivity.setCartBadge(cart.getData().getDetail().size());
                        adapterList.addAll(cart.getData().getDetail()); // Adding Cart Items
                        adapter.notifyDataSetChanged();
                    }
                }
            }
        });
    }

    @Override
    public void onItemDelete(int position) {
        mActivity.showLoading();

        cartViewModel.deleteCartItem(adapterList.get(position).getSkuId()).observe(this, new Observer<ResponseWrapper<Cart>>() {
            @Override
            public void onChanged(ResponseWrapper<Cart> carts) {
                Timber.e("deleteCartItem onChanged Called");
                if (carts.getErrorString() != null) {
                    mActivity.hideLoading();
                    mActivity.showErrorDialog(carts.getErrorString());
                } else {
                    mActivity.hideLoading();
                    if (carts.getResponse().getData().getDetail().size() > 0) {
                        adapterList.clear();
                        mActivity.setCartBadge(carts.getResponse().getData().getDetail().size());
                        adapterList.addAll(carts.getResponse().getData().getDetail()); 
                        adapter.notifyDataSetChanged();

                    }
                }
            }
        });
    }
}

    public class CartViewModel extends AndroidViewModel {
    private static final String TAG = "CartViewModel";
    private MutableLiveData<ResponseWrapper<Cart>> cartList;
    private MutableLiveData<ResponseWrapper<Cart>> deleteFromCartList;

    public CartViewModel(@NonNull Application application) {
        super(application);
    }

    public LiveData<ResponseWrapper<Cart>> getCart() {
        if (cartList == null) {
            cartList = new MutableLiveData<>();
            loadCartItems();
        }
        return cartList;
    }

    private void loadCartItems() {

        Call<Cart> call = bearerApiInterface.getCartItems();
        call.enqueue(new Callback<Cart>() {
            @Override
            public void onResponse(Call<Cart> call, Response<Cart> response) {
                if (response.isSuccessful()) {
                    cartList.setValue(new ResponseWrapper(response.body()));
                } else try {
                    String errorMessage = new APIError().extractMessage(new JSONObject(response.errorBody() != null ? response.errorBody().string().trim() : null));
                    cartList.setValue(new ResponseWrapper(true, errorMessage));
                } catch (JSONException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            @Override
            public void onFailure(Call<Cart> call, Throwable t) {
                cartList.setValue(new ResponseWrapper(true, t.getMessage()));
            }
        });
    }

    public LiveData<ResponseWrapper<Cart>> deleteCartItem(int productId) {
        if (deleteFromCartList == null) {
            deleteFromCartList = new MutableLiveData<>();
            deleteThisItem(productId);
        }
        return deleteFromCartList;
    }

    private void deleteThisItem(int productId) {
        Call<Cart> call = bearerApiInterface.deleteItemFromCart(productId);
        call.enqueue(new Callback<Cart>() {
            @Override
            public void onResponse(Call<Cart> call, Response<Cart> response) {
                if (response.isSuccessful()) {
                    deleteFromCartList.setValue(new ResponseWrapper(response.body()));
                } else try {
                    String errorMessage = new APIError().extractMessage(new JSONObject(response.errorBody() != null ? response.errorBody().string().trim() : null));
                    deleteFromCartList.setValue(new ResponseWrapper(true, errorMessage));
                } catch (JSONException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            @Override
            public void onFailure(Call<Cart> call, Throwable t) {
                deleteFromCartList.setValue(new ResponseWrapper(true, t.getMessage()));
            }
        });
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...