Данные повторного просмотра отклоняются при повороте устройства - PullRequest
0 голосов
/ 20 апреля 2020

Несмотря на то, что я использую ViewModel, всякий раз, когда устройство поворачивается, данные в Recyclerview исчезают. Мне пришлось поместить метод makeSearch () в метод onClick (), потому что мне нужно получить текст, который захватывает кнопка, и использовать его в качестве параметра поиска. Есть ли лучший способ справиться с этим, чтобы избежать этой проблемы? Мой код прямо здесь:

SearchActivity:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_search);

// What happens when the search button is clicked
materialButton.setOnClickListener(new View.OnClickListener() {
    @Override
     public void onClick(View v) {
        if (Objects.requireNonNull(textInputEditText.getText()).toString().isEmpty()) {
             textInputEditText.setError("Type a search query");
            } else {
                mSearchInput = Objects.requireNonNull(textInputEditText.getText()).toString();
                textInputEditText.setText("");
                makeSearch();
            }
        }
    });
}

// Gets the ViewModel, Observes the Question LiveData and delivers it to the Recyclerview
private void makeSearch() {
    final SearchAdapter searchAdapter = new SearchAdapter();
    SearchViewModel mSearchViewModel = new ViewModelProvider(this,
            new CustomSearchViewModelFactory(new SearchRepository())).get(SearchViewModel.class);
    mSearchViewModel.setQuery(mSearchInput);
    mSearchViewModel.getQuestionLiveData().observe(this, new Observer<List<Question>>() {
            @Override
            public void onChanged(List<Question> questions) {
                    mQuestions = questions;
                    searchAdapter.setQuestions(questions);
            }
        });
        mRecyclerView.setAdapter(searchAdapter);
        searchAdapter.setOnClickListener(mOnClickListener);
}

SearchViewModel:

public class SearchViewModel extends ViewModel {

private SearchRepository mSearchRepository;
private MutableLiveData<String> mSearchLiveData = new MutableLiveData<>();
private LiveData<List<Question>> mQuestionLiveData = Transformations.switchMap(mSearchLiveData, (query) -> {
    return mSearchRepository.getQuestions(query);
});

SearchViewModel(SearchRepository searchRepository) {
    this.mSearchRepository = searchRepository;
}

public LiveData<List<Question>> getQuestionLiveData() {
    return mQuestionLiveData;
}

public void setQuery(String query) {
    mSearchLiveData.setValue(query);
}
}

SearchRepository:

public class SearchRepository {

//private String inTitle;
private MutableLiveData<List<Question>> mQuestions = new MutableLiveData<>();

public SearchRepository() {
    //getQuestionsWithTextInTitle();
}

private void getQuestionsWithTextInTitle(String inTitle) {
    ApiService apiService = RestApiClient.getApiService(ApiService.class);
    Call<QuestionsResponse> call = apiService.getQuestionsWithTextInTitle(inTitle);
    call.enqueue(new Callback<QuestionsResponse>() {
        @Override
        public void onResponse(Call<QuestionsResponse> call, Response<QuestionsResponse> response) {
            QuestionsResponse questionsResponse = response.body();
            if (questionsResponse != null) {
                mQuestions.postValue(questionsResponse.getItems());
                //shouldShowData = true;
            } else {
                Log.d("SearchRepository", "No matching question");
                //shouldShowData = false;
            }
        }

        @Override
        public void onFailure(Call<QuestionsResponse> call, Throwable t) {
            //shouldShowData = false;
            t.printStackTrace();
        }
    });
}

public LiveData<List<Question>> getQuestions(String inTitle) {
    getQuestionsWithTextInTitle(inTitle);
    return mQuestions;
}
}

1 Ответ

1 голос
/ 20 апреля 2020

Ваш подход передачи поискового ввода через ваш CustomSearchViewModelFactory и в конструктор для ViewModel и в конструктор для вашего SearchRepository не будет работать ни в коем случае. В то время как при первом поиске ваш CustomSearchViewModelFactory создает ViewModel, во второй раз вы нажимаете кнопку поиска, ваш SearchViewModel уже создан, и ваша фабрика не вызывается второй раз, то есть вы никогда не получите второй запрос.

Вместо этого вам следует подать документацию ViewModel Overview и использовать Transformations.switchMap() для преобразования вашего ввода (строки поиска) в новый LiveData<List<Question>> для данного запроса.

This означает, что ваша ViewModel будет выглядеть примерно так:

public class SearchViewModel extends ViewModel {

    private SearchRepository mSearchRepository;
    private MutableLiveData<String> mSearchLiveData = new MutableLiveData<String>();
    private LiveData<List<Question>> mQuestionLiveData =
        Transformations.switchMap(mSearchLiveData, (query) -> {
            return mSearchRepository.getQuestions(query);
         });

    public SearchViewModel() {
        mSearchRepository = new SearchRepository();
    }

    public void setQuery(String query) {
        mSearchLiveData.setValue(query);
    }

    public LiveData<List<Question>> getQuestionLiveData() {
        return mQuestionLiveData;
    }
}

Затем вы обновите свою активность до:

  1. Всегда соблюдайте getQuestionLiveData() (обратите внимание, что вы не получите обратный вызов вашему наблюдателю до тех пор, пока вы фактически не зададите первый запрос необходимо).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...