我添加了搜索菜单项来过滤我的列表。过滤和重置过滤器一切正常。 但是当用户点击后退按钮时,我找不到重置过滤器的方法。实际上,当用户在搜索字段中添加一些文本时,第一次单击将隐藏键盘,第二次单击将折叠搜索字段并删除我的搜索文本...但列表仍然已过滤。 我该怎么做才能重置列表?
@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);
}
}
答案 0 :(得分:2)
我通过这样做来解决问题:
searchMenuItem.setOnActionExpandListener(new MenuItem.OnActionExpandListener() {
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
return true;
}
@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
refreshSearch("");
return true;
}
});
答案 1 :(得分:0)
您需要在活动中覆盖onBackPressed()
:
@Override
public void onBackPressed() {
if (mSearchView != null && !mSearchView.isIconified()) {
mSearchView.setIconified(true);
} else {
super.onBackPressed();
}
}
答案 2 :(得分:0)
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();
}
}
答案 3 :(得分:0)
经过几个小时的尝试,我发现了。
我正在使用支持库小部件。
用于 SearchView 的setOnCloseListener不再起作用,您应该使用以下代码中的 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 负责对搜索编辑文本输入所做的更改。
因此,如果您注意到默认情况下,当您按下SearchView的后退按钮时,它将清除您输入的文本。
后退按钮将触发 onQueryTextChange ,导致您更改了文本,因此,如果将列表视图的可见性设置为GONE,则问题已解决
@Override
public boolean onQueryTextChange(String s) {
listView.setVisibility(View.GONE);
return false;
}