我在SearchView上设置一个OnQueryTextListener,它返回RecyclerView列表的结果。当用户单击“搜索”图标时,SearchView会在工具栏上展开。除了一个问题,一切正常。当用户在SearchView中输入字符(例如,字母" z")并且在列表中找不到字母时,会发生Toast并清除查询以进行下一次输入由用户。
问题出现在" z"由用户第二次输入。在这种情况下,由于内容" z"从第二个条目完全匹配先前的内容" z"从第一个条目开始,OnQueryTextChange()无法识别任何"更改"在内容中通过比较第二个条目与第一个条目,因此" Not Found" Toast未运行且查询未清除。这应该发生吗?我将如何处理这个问题,以便第二个" z"输入的内容将运行" Not Found"干杯并清除查询(因为我们知道" z"不在列表中)?
MainActivity.java
...
final MenuItem searchItem = menu.findItem(R.id.action_search);
final SearchView mSearchView = (SearchView) MenuItemCompat.getActionView(searchItem);
mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextChange(String newText) {
final ArrayList<ListItem> filteredModelList = adapter.filter(adapter.listItems, newText);
if(filteredModelList.size() > 0) {
adapter.setFilter(filteredModelList);
return true;
} else {
Toast.makeText(MainActivity.this, "Not Found", Toast.LENGTH_SHORT).show();
mSearchView.setQuery("", false); // Clear the query
return false;
}
}
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
});
Adapter file:
public class MyRecylerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
public ArrayList<ListItem> listItems;
private Context mContext;
public MyRecylerAdapter(Context context, ArrayList<ListItem> listItems) {
this.listItems = listItems;
this.mContext = context;
}
...
public void setFilter(ArrayList<ListItem> listItem) {
listItems = new ArrayList<>();
listItems.addAll(listItem);
notifyDataSetChanged();
}
public ArrayList<ListItem> filter(ArrayList<ListItem> models, String query) {
query = query.toLowerCase();
final ArrayList<ListItem> filteredModelList = new ArrayList<>();
for (ListItem model : models) {
final String text = model.getTodo().toLowerCase();
if (text.contains(query)) {
filteredModelList.add(model);
}
}
return filteredModelList;
}