当前位置: 首页 > 知识库问答 >
问题:

带有SearchView临时筛选RecyclerView的工具栏

司空实
2023-03-14

我需要在我的android应用程序中实现搜索功能,该应用程序使用工具栏、SlidingTableOut和保存片段的ViewPager。在每个片段中都有一个带有项目列表的RecyclerView。

recycle view数据是在单独的类(DataAccess.java)中静态定义的,只需调用(不传递新数据)即可更新这些列表并刷新recycle view

mRecyclerView.getAdapter().notifyDataSetChanged();

有什么简单的方法可以在不改变数据的情况下,在用户按下工具栏中的返回按钮后,移除过滤器并显示初始列表。

在按工具栏菜单内的“搜索”图标之前:

因此,当用户键入“Josip...”时过滤器将处于活动状态

在他按下SearchView中的X按钮后,用户将获得与之前相同的数据,没有过滤。

@Override 
public boolean onQueryTextChange(String newText) {
    // filter data (temporary remove all items from DataAccess.list that don't .startsWith(newText)
}

@Override 
public boolean onQueryTextSubmit(String query)
    // Doesn't help if I revert deleted items here
}

共有3个答案

蒯宇定
2023-03-14

我不反对给定和公认的答案。可能存在性能陷阱的空间。应该使用Filterabe接口。实现这个将表现为异步执行过滤的ol'goodListView。然后您只需要编写自己的Filter并在覆盖的getFilter()方法中实例化它;

在我的例子中,我使用Filter对许多(是的,许多许多)项目的适配器进行排序。在UI线程上对其进行排序是垃圾。

所以我有一个抽象类

public abstract class BaseFilterableRecyclerViewAdapter<VH extends RecyclerView.ViewHolder> extends RecyclerView.Adapter<VH> implements Filterable {

    private Context mContext;
    public BaseFilterableRecyclerViewAdapter(Context context) {
        this.mContext = context;
    }
    public abstract void sort(SortingFilter.Sort sortingStrategy);

    //...Other methods

}

继承的类:

public class ItemAdapter extends BaseFilterableRecyclerViewAdapter<RecyclerView.ViewHolder>{


  //... RecyclerView methods


  @Override
    public Filter getFilter() {
        return new SortingFilter(mData) {
            @Override
            protected void publishResults(CharSequence constraint, FilterResults results) {
                if (results.values != null) {
                    int last = mData.size();
                    mData = (List<Product>) results.values;
                    notifyDataSetChanged();
                }
            }
        };
    }



    @Override
    public void sort(SortingFilter.Sort sortingStrategy) {
        getFilter().filter(sortingStrategy.toString());
    }

}
甄华清
2023-03-14

我想添加作为评论,但由于声誉较低...我正在回复帖子。如果(item.toLowerCase()。包含(queryText)),此方法可以正常工作,但如果在第一个iteration.then没有找到匹配,该怎么办它将进入其他部分,而不会在所有对象列表中循环...

for (RouteByATMList.Route_ATM item: Main_ATMItemList)
        {

            if (item.ATMNumber.contains(queryText)) {
                visibleObjects.add(item);
            }else {
                Toast.makeText(mContext,"No search result found!",Toast.LENGTH_SHORT).show();
                break;
            }
        }

我从我的上司那里得到了答案,希望它有帮助。

public void setFilter(String queryText) {
        visibleObjects = new ArrayList<>();
        for (RouteByATMList.Route_ATM item: Main_ATMItemList)
        {
            if (item.ATMNumber.contains(queryText))
            {
                visibleObjects.add(item);
            }
        }

        if(visibleObjects.size()==0){
            Toast.makeText(mContext,"No search result found!",Toast.LENGTH_SHORT).show();
        }

        notifyDataSetChanged();
        Log.e("dataset changed","dataset changed");
    }
姬英武
2023-03-14
@Override 
public boolean onQueryTextSubmit(String query){
    ((ItemAdapter) myRecList.getAdapter()).setFilter(query)
}
public class ItemAdapter extends RecyclerView.Adapter<ItemAdapter.ViewHolder> {

    private List<String> visibleObjects;
    private List<String> allObjects;

    .....

    public void flushFilter(){
        visibleObjects=new ArrayList<>();
        visibleObjects.addAll(allObjects);
        notifyDataSetChanged();
    }

    public void setFilter(String queryText) {

        visibleObjects = new ArrayList<>();
        constraint = constraint.toString().toLowerCase();
        for (String item: allObjects) {            
                if (item.toLowerCase().contains(queryText))                     
                    visibleObjects.add(item);            
        }
       notifyDataSetChanged();
    }
}
 类似资料:
  • 我正在尝试从支持库中实现。我希望用户使用在中筛选电影的。 到目前为止,我已经学习了一些教程,并且已经将添加到中,但我不确定从这里要往哪走。我已经看到了一些例子,但没有一个显示结果,当您开始键入。 这是我的: 这是我的:

  • 关于searchview,我有一个简单的问题--我在我的菜单中创建了searchview项,我有功能gridview,但我不知道如何在onCreateOptionMenu中完成我的代码--它不会识别我的GridAdapter。以下代码 gridAdapter是我的gridview的适配器,但它显示为红色,这是我不明白的。顺便说一句:即使在OnCreateOptionsMenu中添加了这两行,应用程

  • 带有可筛选得适配器: filter由于某种原因不起作用,当我键入某些内容时,它会清除recyclerview

  • 我有一个带有FireBaseRecyclerAdapter的RecyclerView。当用户开始输入SearchView时,我想用一个名称列表填充RecycerView。 也是对查询进行忽略的方法吗?

  • 我分别在和上找到了筛选器的解决方案,但我希望将它们结合起来。有可能吗?

  • “{”error“:{”root_case“:[{”type“:”parsing_exception“,”reason“:”[match_all]格式错误的查询,预期[END_OBJECT]但找到[FIELD_NAME]“,”line“:”line“:1,”col“:26}”,“status”:400}“,”type“:”parsing_exception“,”reason“:”[match_al