Сбросить поиск в SearchView, когда вы нажимаете «Назад»

Я добавил пункт меню «Поиск», чтобы отфильтровать мой список. Все работает нормально с фильтрацией и сбросом фильтра. Но я не могу найти способ сбросить фильтр, когда пользователь нажимает кнопку «Назад». На самом деле, когда пользователь добавляет какой-либо текст в поле поиска, первый щелчок назад скроет клавиатуру, а второй щелчок свернет поле поиска и удалит текст поиска... но список все еще отфильтрован. Что мне делать, чтобы сбросить список?

@Override
public boolean onCreateOptionsMenu(Menu menu) {

    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.search_menu, menu);

    searchMenuItem = menu.findItem(R.id.action_search);
    SearchView mSearchView = (SearchView) MenuItemCompat.getActionView(searchMenuItem);

    if (mSearchView != null) {
        mSearchView.setIconifiedByDefault(true);
        mSearchView.setOnQueryTextListener(this);
    }
    return super.onCreateOptionsMenu(menu);
}

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

private void refreshSearch(String s) {
    FragmentManager fm = getSupportFragmentManager();
    MyListFragment listFragment = (MyListFragment)fm.getFragments().get(0);
    MyArrayAdapter arrayAdapter = (MyArrayAdapter)listFragment.getListAdapter();
    arrayAdapter.getFilter().filter(s);
}

Отредактируйте мой вопрос, добавив дополнительный код, который может помочь узнать причину

@Override
public boolean onQueryTextSubmit(String s) {
    hideKeyboard();
    return false;
}
@Override
public boolean onQueryTextChange(String s) {
    refreshSearch(s);
    return false;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle presses on the action bar items
    switch (item.getItemId()) {
        case R.id.action_search:
            return true;
        default:
            return false; //return super.onOptionsItemSelected(item);
    }
}

person bunjeeb    schedule 24.05.2014    source источник


Ответы (4)


Я решаю проблему, делая это:

searchMenuItem.setOnActionExpandListener(new MenuItem.OnActionExpandListener() {

        @Override
        public boolean onMenuItemActionExpand(MenuItem item) {
            return true;
        }

        @Override
        public boolean onMenuItemActionCollapse(MenuItem item) {
            refreshSearch("");
            return true;
        }
    });
person bunjeeb    schedule 24.05.2014
comment
Может получить ошибку «Это не поддерживается». В этом случае используйте это: stackoverflow.com/a/32168733/5437165 - person Prof; 08.06.2016

Вам нужно будет переопределить onBackPressed() в своей деятельности:

@Override
public void onBackPressed() {
    if (mSearchView != null && !mSearchView.isIconified()) {
        mSearchView.setIconified(true);
    } else {
        super.onBackPressed();
    }
}
person user3264740    schedule 24.05.2014
comment
Привет, спасибо за ваш ответ. это даже не работает :( ... Первый щелчок скроет клавиатуру, второй щелчок свернет поиск и потеряет фокус поиска (я хочу сбросить свой список здесь) ... В 3-м обратном щелчке ваше событие будет поднято, но не во второй спине. ... Я добавлю несколько дополнительных кусков кода, которые могут помочь - person bunjeeb; 24.05.2014

searchView должен быть глобальными переменными, тогда вам нужно сделать это в методе onQueryTextSubmit

    @Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu_main, menu);


    MenuItem searchMenuItem = menu.findItem(R.id.app_bar_search);


    if (searchMenuItem != null) {
        searchView = (SearchView) searchMenuItem.getActionView();
        searchView.setFocusable(true);
        searchView.setQueryHint("Ara...");
        searchView.requestFocusFromTouch();
    }

    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String s) {
            searchView.clearFocus();
            return false;
        }

        @Override
        public boolean onQueryTextChange(String s) {
            adapter.getFilter().filter(s);
            return true;
        }
    });


    return super.onCreateOptionsMenu(menu);
}

затем метод onBackPressed

@Override
public void onBackPressed() {

    if (!searchView.isIconified() && searchView != null) {
        searchView.setIconified(true);
        searchView.onActionViewCollapsed();
    } else {
        super.onBackPressed();
    }

}
person Barış Mercan    schedule 08.02.2018

после нескольких часов попыток я понял это.
Я использую виджеты библиотеки поддержки.
setOnCloseListener для SearchView больше не работает, вы должны сделать это с помощью onQueryTextChange в приведенном ниже коде

searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String s) {
                try {
                    listView.setAdapter(new MyAdapter();
                    listView.setVisibility(View.VISIBLE);
                } catch (IOException e) {
                    e.printStackTrace();
                }
                return false;
            }

            @Override
            public boolean onQueryTextChange(String s) {
                listView.setVisibility(View.GONE);
                return false;
            }

        });

onQueryTextChange отвечает за изменения, внесенные в ваш поисковый текст edittext.
поэтому, если вы заметили, по умолчанию, когда вы нажимаете кнопку "Назад" SearchView, он очищает введенный вами текст.
кнопка "назад" вызовет onQueryTextChange, потому что вы изменили текст, поэтому, если вы установите для просмотра списка значение GONE, проблема будет решена

@Override
            public boolean onQueryTextChange(String s) {
                listView.setVisibility(View.GONE);
                return false;
            }
person Reza    schedule 04.09.2019