Как не допустить дублирования даты в прямом эфире на спине, нажатой из другого фрагмента и при отзыве - PullRequest
1 голос
/ 14 апреля 2020

Здравствуйте, у меня есть две проблемы, касающиеся живых данных с моделью представления и компонентом навигации. Первая - когда я go из фрагмента A с активными данными в фрагмент B, а затем из B в A данные в моем списке дублируются, другой проблема в том, что я вызываю viewModel.loadList() в моем фрагменте после создания, и событие для фильтрации данных также дублируется

вот моя модель представления

  public class HomeViewModel extends ViewModel {
  MutableLiveData<ArrayList<HomeResponseModel>> homeLiveData = new MutableLiveData<>();
    ArrayList<HomeResponseModel> homeList = new ArrayList<>();
     public MutableLiveData<ArrayList<HomeResponseModel>> geHomeList(HomeRequestModel homeRequestModel, Context context, ApiInterface apiInterface, LottieAnimationView lottieAnimationView) {
            if (homeLiveData == null) {
                homeLiveData = new MutableLiveData<ArrayList<HomeResponseModel>>();
                loadHomeList(homeRequestModel);

            }
            return homeLiveData;
        }
  public void loadHomeList(HomeRequestModel homeRequestModel) {

            Call<List<HomeResponseModel>> call = apiInterface.getHomeList(homeRequestModel, );
            call.enqueue(new Callback<List<HomeResponseModel>>() {
                @Override
                public void onResponse(Call<List<HomeResponseModel>> call, Response<List<HomeResponseModel>> response) {

                    if (response.isSuccessful()) {
                        homeList.addAll(response.body());
                        homeLiveData.setValue(homeList);
                    }

                }

                @Override
                public void onFailure(Call<List<HomeResponseModel>> call, Throwable t) {

                }
            });


    }

мой наблюдатель в onCreateView

viewModel.geHomeList(homeRequestModel).observe(getViewLifecycleOwner(), new Observer<ArrayList<HomeResponseModel>>() {
            @Override
            public void onChanged(ArrayList<HomeResponseModel> homeResponse) {


                homeResponseModels.addAll(homeResponse);
                homeAdapter.notifyDataSetChanged();
            }
        });



        }

как я вызываю метод загрузки после события фильтра

            viewModel.loadHomeList(homeRequestModel);

1 Ответ

2 голосов
/ 14 апреля 2020

Очистите список перед добавлением новых моделей:

viewModel.geHomeList(homeRequestModel).observe(getViewLifecycleOwner(), new Observer<ArrayList<HomeResponseModel>>() {
            @Override
            public void onChanged(ArrayList<HomeResponseModel> homeResponse) {
                homeResponseModels.clear();
                homeResponseModels.addAll(homeResponse);
                homeAdapter.notifyDataSetChanged();
            }
        });
}

Или, что еще лучше:

Если ваш адаптер содержит List или HomeResponseModel, вы можете создать метод для его обновления:

public update(List<HomeResponseModel> homeResponse) {
    this.homeResponseModels = homeResponse;
    notifydatasetchanged();
}

и затем измените метод наблюдения, чтобы вызвать его:

viewModel.geHomeList(homeRequestModel).observe(getViewLifecycleOwner(), new Observer<ArrayList<HomeResponseModel>>() {
            @Override
            public void onChanged(ArrayList<HomeResponseModel> homeResponse) {
                homeAdapter.update(homeResponse);
            }
        });
}

Кроме того, в вашей ViewModel в методе loadHomeList в обратном вызове onResponse вы можете присвоить полученные данные liveData:

if (response.isSuccessful()) {
    homeLiveData.setValue(response.body());
}

нет необходимости сохранять его в homeList var, вы можете избавиться от этого var. В противном случае выполните homeList.clear(); перед добавлением в него всех полученных данных, чтобы избежать дублирования.

...