Android onQueryTextChange:如何消除SearchView的重复匹配错误

时间:2017-02-03 07:29:54

标签: android android-recyclerview searchview

我在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;
}

0 个答案:

没有答案