如何防止实时日期在从另一个片段按下并在召回时重复

How to prevent Live date from duplication in on back pressed from another fragment and on recall

你好,关于视图模型和导航组件的实时数据,我有两个问题,第一个是当我从带有实时数据的片段 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);

在添加新模型之前清除列表:

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);
            }
        });
}

除此之外,在 onResponse 回调的 loadHomeList 方法中的 ViewModel 中,您可以将接收到的数据分配给 liveData:

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

无需将其保存在 homeList var 中,您可以删除该 var。否则,在将所有接收到的数据添加到其中之前执行 homeList.clear(); 以避免重复。