使用SearchView临时过滤RecyclerView的工具栏

fpo*_*pic 12 android-fragments searchview android-toolbar android-recyclerview

我需要在我的Android应用程序中实现搜索功能,它使用工具栏,SlidingTabLayout和保存片段的ViewPager.在每个片段中都有一个包含项目列表的RecyclerView.

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

mRecyclerView.getAdapter().notifyDataSetChanged();
Run Code Online (Sandbox Code Playgroud)

有没有简单的方法临时过滤RecyclerView而不更改数据,并在用户按下工具栏内的返回按钮后删除过滤器并显示初始列表.

在按工具栏菜单中的搜索图标之前:

在此输入图像描述

因此,当用户输入"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
}
Run Code Online (Sandbox Code Playgroud)

小智 23

@Override 
public boolean onQueryTextSubmit(String query){
    ((ItemAdapter) myRecList.getAdapter()).setFilter(query)
}
Run Code Online (Sandbox Code Playgroud)
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();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @fpopic你可以发布你的解决方案吗? (2认同)