Предположим, что нижняя панель навигации имеет два фрагмента, то есть 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()));
}
});
}
}