Android - Searchview может выполнять только один поиск - PullRequest
0 голосов
/ 01 октября 2019

Я сделал функцию поиска фильмов с поиском. Когда я выполняю первый поиск, то появляются данные или список, но когда я хочу выполнить поиск снова с новым поисковым словом, а затем отправляю, следующие данные или список не отображаются, а отображаются только предыдущие данные. нет даже реакции на поиск следующих данных. когда я выхожу и возвращаюсь к фрагменту, поиск продолжается, как и раньше, есть ли решение для этого? спасибо

MovieSearchFragment

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_search_movie, container, false);

    recyclerView = view.findViewById(R.id.recyclerView);
    searchView = view.findViewById(R.id.searchView);
    searchView.setOnQueryTextListener(this);

    setupRecyclerView();

    return view;
}    

private void loadMovie(String search) {

    search = searchView.getQuery().toString();

    SearchMovieViewModel viewModel = ViewModelProviders.of(Objects.requireNonNull(getActivity())).get(SearchMovieViewModel.class);
    viewModel.init(search);
    viewModel.getSeacrhMovie().observe(this, new Observer<MovieResponse>() {
        @Override
        public void onChanged(MovieResponse movieResponse) {
            if (movieResponse != null) {
                List<Movie> movies = movieResponse.getResults();
                searchMovieList.addAll(movies);
                adapter.notifyDataSetChanged();
                showLoading(false);
            } else {
                showLoading(false);
                showError();
            }
        }
    });
}

@Override
public boolean onQueryTextSubmit(String query) {
    showLoading(true);
    loadMovie(query);
    return false;
}

@Override
public boolean onQueryTextChange(String s) {
    return false;
}

private void setupRecyclerView() {
    if (adapter == null) {
        adapter = new MovieAdapter(getActivity(), searchMovieList);
        recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
        recyclerView.setAdapter(adapter);
        recyclerView.setItemAnimator(new DefaultItemAnimator());
        recyclerView.setNestedScrollingEnabled(true);
    }
}

Viewmodel

public class SearchMovieViewModel extends ViewModel {
    private MutableLiveData<MovieResponse> mutableLiveData;

    public void init(String movieTitle) {
        if (mutableLiveData != null) {
            return;
        }

        Repository repository = Repository.getInstance();
        mutableLiveData = repository.getSearchMovie(BuildConfig.API_KEY, movieTitle);
    }

    public MutableLiveData<MovieResponse> getSeacrhMovie() {
       return mutableLiveData;
    }
}

Репозиторий

public MutableLiveData<MovieResponse> getSearchMovie(String apiKey, String movieTitle) {
    final MutableLiveData<MovieResponse> searchData = new MutableLiveData<>();
    api.getSearchMovie(BuildConfig.API_KEY, movieTitle).enqueue(new Callback<MovieResponse>() {
        @Override
        public void onResponse(Call<MovieResponse> call, Response<MovieResponse> response) {
            if (response.isSuccessful()) {
                searchData.setValue(response.body());
            } else {
                searchData.setValue(null);
            }
        }

        @Override
        public void onFailure(Call<MovieResponse> call, Throwable t) {
            searchData.setValue(null);
        }
    });
    return searchData;
}

Ответы [ 2 ]

0 голосов
/ 03 октября 2019

решено

Я обнаружил проблему в своем хранилище, а затем заменил ее на LiveData и добавил postValue в качестве получателя нового значения. Кроме того, я попытался установить адаптер в обозревателе и немного изменил метод setupRecyclerView. пока, наконец, функция поиска не сможет работать должным образом, спасибо всем, кто помог

MovieFragment

  @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_search_movie, container, false);

    progressBar = view.findViewById(R.id.progressBar);
    recyclerView = view.findViewById(R.id.recyclerView);
    searchView = view.findViewById(R.id.searchView);
    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String query) {
            showLoading(true);
            loadMovie(query);
            return false;
        }

        @Override
        public boolean onQueryTextChange(String newText) {
            return false;
        }
    });

    setupRecyclerView();

    return view;
}

private void loadMovie(String title) {
    title = searchView.getQuery().toString();

    SearchMovieViewModel viewModel = ViewModelProviders.of(this).get(SearchMovieViewModel.class);
    viewModel.init(title);
    viewModel.getSearchMovie().observe(this, new Observer<MovieResponse>() {
        @Override
        public void onChanged(MovieResponse movieResponse) {
            if (movieResponse != null) {
                List<Movie> movieList = movieResponse.getResults();
                adapter = new MovieAdapter(getActivity(), movieList);
                recyclerView.setAdapter(adapter);
                adapter.notifyDataSetChanged();
                showLoading(false);
            } else {
                showLoading(false);
                showError();
            }
        }
    });
}

private void setupRecyclerView() {
    recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
    recyclerView.setItemAnimator(new DefaultItemAnimator());
    recyclerView.setNestedScrollingEnabled(true);
}

ViewModel

public class SearchMovieViewModel extends ViewModel {
private LiveData<MovieResponse> movieLiveData;

public void init(String movieTitle) {
    Repository repository = Repository.getInstance();
    movieLiveData = repository.getSearchMovie(BuildConfig.API_KEY, movieTitle);
}

public LiveData<MovieResponse> getSearchMovie() {
    return movieLiveData;
}
}

Хранилище

  public LiveData<MovieResponse> getSearchMovie(String apiKey, String movieTitle) {
    final MutableLiveData<MovieResponse> searchData = new MutableLiveData<>();
    api.getSearchMovie(BuildConfig.API_KEY, movieTitle).enqueue(new Callback<MovieResponse>() {
        @Override
        public void onResponse(Call<MovieResponse> call, Response<MovieResponse> response) {
            if (response.isSuccessful()) {
                searchData.postValue(response.body());
                searchData.setValue(response.body());
            } else {
                searchData.setValue(null);
            }
        }

        @Override
        public void onFailure(Call<MovieResponse> call, Throwable t) {
            searchData.setValue(null);
        }
    });
    return searchData;
}
0 голосов
/ 01 октября 2019

Я думаю, что проблема в вашем репозитории, где вы создаете новые MutableLiveData при каждом вызове. Вы должны соблюдать один MutableLiveData, и вы должны вызывать postValue для этого MutableLiveData каждый раз, когда вы получаете новый ответ, чтобы наблюдатель (в Activity / Fragment) извлекал новые данные.

...