如何搜索RecyclerView中显示的对象列表?

时间:2017-07-07 17:59:50

标签: android android-recyclerview searchview

我目前正在尝试实施SearchView,但显示的搜索结果仅针对第一个搜索进行更改,我在SearchView中输入的所有内容都将被忽略。

以下是我的MainActivity.java搜索代码:

testList = Arrays.asList(new TestItem("aw"), new TestItem("aa"), new TestItem("w"));

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

    SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
    searchView.setOnQueryTextListener(this);
    return super.onCreateOptionsMenu(menu);
}

@Override
public boolean onQueryTextChange(String newText) {
    List<TestItem> result = new ArrayList<>();
    for(TestItem t: testList) {
        if(t.getName().contains(newText) {
            result.add(t);
        }
    }
    adapter.changeList(result);
    return true;
}

adapter.changeList:

public void changeList(List<TestItem> newList) {
    this.list = new ArrayList<>(newList);
}
每次文本更改后都会调用onQueryTextChange,但搜索结果只显示一次。在输入aEnter时,RecyclerView会显示awaa(正常情况下必须按Enter键才能启动onQueryTextChange),但是当我然后输入aa显示的项目保持不变。

1 个答案:

答案 0 :(得分:1)

我认为您的实施不正确。您无需按Enter键即可搜索结果。为了实现,您可以保留数组列表的完整副本。然后在更改查询文本时创建另一个临时列表表单。因此,当您进行过滤时,您正在搜索实际列表而不是过滤列表。

1.将搜索关键字传递给列表适配器

public boolean onQueryTextChange(String newText) {

    adapter.getFilter().filter(newText);
    return true;
}

2。在适配器实现Filterable和覆盖方法

@Override
public Filter getFilter() {
    if (frameFilter == null) {
        frameFilter = new FrameFilter();
    }

    return frameFilter;
}

3。过滤类可以是这样的:'categoryMain'是我的完整列表,'categoryTemp'是我的临时列表

private class FrameFilter extends Filter {

    @Override
    protected FilterResults performFiltering(CharSequence constraint) {

        FilterResults filterResults = new FilterResults();
        if (constraint != null && constraint.length() > 0) {
            ArrayList<Category> tempList = new ArrayList<>();

            // search content in friend list
            Log.i("key",constraint.toString());
            for (Category category : categoriesMain) {
                if (category.getCategory_name().toLowerCase().contains(constraint.toString().toLowerCase())) {
                    tempList.add(category);
                }
            }
            filterResults.count = tempList.size();
            filterResults.values = tempList;
        } else {

            filterResults.count = categoriesMain.size();
            filterResults.values = categoriesMain.clone();
        }
        return filterResults;
    }

    /**
     * Notify about filtered list to ui
     *
     * @param constraint text
     * @param results    filtered result
     */
    @SuppressWarnings("unchecked")
    @Override
    protected void publishResults(CharSequence constraint, FilterResults results) {

        categoriesTemp = (ArrayList<Category>) results.values;
        notifyDataSetChanged();
    }
}