3

I added Search menu item to filter my list. Everything is working fine with filtering and reset filter. But I cannot find a way to reset the filter when user click on back button. Actually when user add some text in search field, the first back click will hide the keyboard, and the second click will collapse search field and remove my search text ... but the list still filtered. What should I do to reset the list?

@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);
}

Edit my question by adding some extra code, that may help to know the reason

@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);
    }
}
bunjeeb
  • 1,096
  • 1
  • 17
  • 32

4 Answers4

4

I solve the problem by doing this:

searchMenuItem.setOnActionExpandListener(new MenuItem.OnActionExpandListener() {

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

        @Override
        public boolean onMenuItemActionCollapse(MenuItem item) {
            refreshSearch("");
            return true;
        }
    });
bunjeeb
  • 1,096
  • 1
  • 17
  • 32
  • 1
    May get a "This is not supported" error. In which case, use this: http://stackoverflow.com/a/32168733/5437165 – Prof Jun 08 '16 at 15:07
0

You will need to override onBackPressed() in your activity:

@Override
public void onBackPressed() {
    if (mSearchView != null && !mSearchView.isIconified()) {
        mSearchView.setIconified(true);
    } else {
        super.onBackPressed();
    }
}
user3264740
  • 231
  • 1
  • 2
  • 13
  • 1
    Hi, thank you for your respond. this even is not working :( ... The first back will hide keyboard, second click will collapse the search and lost focus the search (I want to reset my list here) ... In 3rd back click your event will be raised but not in the second back. ... I will add some extra chunks of code, that may help – bunjeeb May 24 '14 at 10:48
0

searchView should be global variables then you need to do in onQueryTextSubmit method

    @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);
}

then onBackPressed method

@Override
public void onBackPressed() {

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

}
0

after a few hours attempt I figured it out.
I'm using support library widgets.
setOnCloseListener for SearchView no longer works, the way you should do it is to use onQueryTextChange in the below code

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 is responsible for changes made to your search edittext input.
so if you noticed, by default when you press SearchView's back button it clears the text you inputed.
well back button will trigger onQueryTextChange cause you changed the text, so if you set visibily of your listview to GONE the problem is fixed

@Override
            public boolean onQueryTextChange(String s) {
                listView.setVisibility(View.GONE);
                return false;
            }
Reza
  • 845
  • 13
  • 18