У меня есть значок SearchView на панели инструментов через onCreateOptionsMenu (меню меню). Щелчок по значку создает строку EditText для пользователя, чтобы ввести входные данные поиска. У меня есть TextWatcher (), присоединенный к строке EditText, так что при добавлении текста в строку (afterTextChanged Editable s) через SearchModel запускается метод searchQuery, который ищет базу данных Room.
Моя проблема заключается в том, чтоОбозреватель запускается при создании еще до того, как пользователь вводит какой-либо запрос. Используя тосты, я смог подтвердить, что наблюдатель запускает пустой запрос «%%» прямо при нажатии пользователем значка SearchView и до того, как пользователь вводит какой-либо поисковый запрос. И это происходит, даже если наблюдатель настроен в afterTextChanged (). Как заставить наблюдатель ViewModel срабатывать только после ввода текста пользователем?
Activity
...
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.mainactiv_menu, menu);
searchItem = menu.findItem(R.id.action_search);
menu.findItem(R.id.action_search).setVisible(false);
if (cardsAdapter != null && cardsAdapter.getItemCount() > 0) {
menu.findItem(R.id.action_search).setVisible(true);
}
SearchManager searchManager = (SearchManager) MainActivity.this.getSystemService(Context.SEARCH_SERVICE);
if (searchItem != null) {
mSearchView = (SearchView) searchItem.getActionView();
if (mSearchView != null) {
mSearchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
EditText mSearchEditText = mSearchView.findViewById(androidx.appcompat.R.id.search_src_text);
mSearchEditText.setInputType(android.text.InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);
mSearchEditText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
// not needed
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// not needed
}
@Override
public void afterTextChanged(Editable s) {
String queryText = "%" + s.toString() + "%";
mQuickcardViewModel.searchQuery(queryText).observe(MainActivity.this, searchCards -> {
searchList = searchCards;
if (!mSearchView.isIconified() && searchList.size() > 0) {
// do something
}
...