Android LiveData: Transformation switchMap: применить фильтр к исходному списку и показать отфильтрованные данные - PullRequest
0 голосов
/ 01 февраля 2020
public class FlightViewModel extends BaseViewModel {

    private FlightRepository flightRepository;
    private MediatorLiveData<Resource<FlightSearchMainOuterModel>> mSearchFlights = new MediatorLiveData<>();
    private MediatorLiveData<Resource<FlightSearchMainOuterModel>> mOriginalList = new MediatorLiveData<>();
    private MediatorLiveData<Resource<FlightSearchMainOuterModel>> mSortedSearchFlights = new MediatorLiveData<>();



    public FlightViewModel(@NonNull Application application) {
        super(application);
        flightRepository = FlightRepository.getInstance(application);
    }

    @Override
    public void updateResults() {

    }

    public void postFlightSearch() {


        mSearchFlights.addSource(flightRepository.postFlightSearchData(requestJson), mSearchFlights::setValue);
    }




    public LiveData<Resource<FlightSearchMainOuterModel>> getFlightResult() {
        return Transformations.map(mSearchFlights, input -> {

            if (input == null || input.data == null || input.status != Resource.Status.SUCCESS)
                return null;

            if (input.status == Resource.Status.SUCCESS && input.data != null) {
                if (input.data.getError().getErrorCode().equalsIgnoreCase("1")) {
                    FlightSearchModel flightSearchModel;
                    List<FlightSearchMainOuterResultOnwordReturnModel> onword = input.data.getResults().getOnword();
                    for (FlightSearchMainOuterResultOnwordReturnModel onwordLiveData : onword) {
                        flightSearchModel = onwordLiveData.getSegments().get(0);
                        flightSearchModel.getDurationFormat(onwordLiveData.getSegments());
                    }
                    return Resource.cloneResource(input, input.data);
                }
            } else if(input.status == Resource.Status.LOADING){
                return Resource.loading(null);
            } else {
                return Resource.error("Error! Please try again.", null);
            }

            return null;
        });

    }

    public void copyToOrignal(){
        mOriginalList = new MediatorLiveData<>();
        mOriginalList.setValue(mSearchFlights.getValue());
    }

    public LiveData<Resource<FlightSearchMainOuterModel>> getSortedFlightResult() {
        return mSortedSearchFlights;
    }





    public void nonStop(boolean isOneStop) {
        copyToOrignal();
        LiveData<Resource<FlightSearchMainOuterModel>> onwordLiveData = Transformations.map(mOriginalList, input -> {
            if (input == null || input.data == null || input.status != Resource.Status.SUCCESS)
                return null;

            List<FlightSearchMainOuterResultOnwordReturnModel> onwordNewList = new ArrayList<>();

            List<FlightSearchMainOuterResultOnwordReturnModel> onword = input.data.getResults().getOnword();
            if (onword.size() > 0) {

                if(isOneStop){
                    for(int i =0; i<onword.size(); i++){
                        if(onword.get(i).getSegments().size()>1 || !onword.get(i).getSegments().get(0).getNumberofStops().equalsIgnoreCase("0")){
                            onwordNewList.add(onword.get(i));

                        }
                    }
                }else {
                    for(int i =0; i<onword.size(); i++){
                        if(onword.get(i).getSegments().size()==1){
                            if(onword.get(i).getSegments().get(0).getNumberofStops().equalsIgnoreCase("0")){
                                onwordNewList.add(onword.get(i));
                            }
                        }
                    }
                }
                input.data.getResults().setOnword(onwordNewList);
            }
            return Resource.cloneResource(input, input.data);
        });

        mSortedSearchFlights.addSource(onwordLiveData, mSortedSearchFlights::setValue);

    }

}

В mSearchFlights я получаю весь список, к которому я должен применить фильтр. После применения одного фильтра исходный список mSearchFlights фильтруется даже после копирования данных в другой liveData. Таким образом, при применении фильтра во второй раз он работает с отфильтрованным списком, а не с исходным списком, который называется mSearchFlights. Поэтому, пожалуйста, помогите мне в применении фильтра.

Во фрагменте я наблюдаю две одинаковые жизни:

flightViewModel.getFlightResult().observe(this, flightSearchModelResource -> {
            if (flightSearchModelResource == null)
                return;
            if (flightSearchModelResource.status == Resource.Status.SUCCESS && flightSearchModelResource.data != null) {

                if (flightSearchModelResource.data.getError().getErrorCode().equalsIgnoreCase("1")) {
                    firstOrderAdapter.setData(flightSearchModelResource.data.getResults().getOnword());

                } else {
                    Utils.toastLong(getContext(), flightSearchModelResource.data.getError().getErrorMessage());

                }
            } 
        });


flightViewModel.getSortedFlightResult().observe(this, flightSearchModelResource -> {
            if (flightSearchModelResource == null)
                return;
            if (flightSearchModelResource.status == Resource.Status.SUCCESS && flightSearchModelResource.data != null) {

                if (flightSearchModelResource.data.getError().getErrorCode().equalsIgnoreCase("1")) {
                    if(flightSearchModelResource.data.getResults().getOnword().size()>0){
                        firstOrderAdapter.setData(flightSearchModelResource.data.getResults().getOnword());

                    }
                } else {
                    Utils.toastLong(getContext(), flightSearchModelResource.data.getError().getErrorMessage());

                }
            } 
        });

1 Ответ

0 голосов
/ 03 февраля 2020

Пожалуйста, прочтите этот документ и примените преобразование switchMap к исходным данным. Это не изменит ваших исходных значений LiveData.

...