Android fragments 带有SearchView临时筛选回收视图的工具栏

Android fragments 带有SearchView临时筛选回收视图的工具栏,android-fragments,searchview,android-recyclerview,android-toolbar,Android Fragments,Searchview,Android Recyclerview,Android Toolbar,我需要在我的android应用程序中实现搜索功能,它使用工具栏、SlidingTableOut和保存片段的ViewPager。在每个片段中都有一个包含项目列表的RecyclerView RecyclerView数据是在单独的类(DataAccess.java)中静态定义的,这些列表只需调用(不传递新数据)即可更新和刷新 在用户按下工具栏内的返回按钮删除过滤器并显示初始列表后,是否有任何简单的方法可以在不更改数据的情况下临时筛选回收视图 在按下工具栏菜单内的搜索图标之前: 因此,当用户键入“Jo

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

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

在用户按下工具栏内的返回按钮删除过滤器并显示初始列表后,是否有任何简单的方法可以在不更改数据的情况下临时筛选回收视图

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

因此,当用户键入“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
}

公共类ItemAdapter扩展了RecyclerView.Adapter{ 私有列表可见对象; 私有列表所有对象; ..... public void flushFilter(){ visibleObjects=新建ArrayList(); visibleObjects.addAll(allObjects); notifyDataSetChanged(); } 公共void setFilter(字符串queryText){ visibleObjects=新建ArrayList(); constraint=constraint.toString().toLowerCase(); 对于(字符串项:AllObject){ if(item.toLowerCase().contains(queryText)) visibleObjects.add(项目); } notifyDataSetChanged(); } }
我想添加评论,但由于声誉不佳……我正在回复帖子。 如果(item.toLowerCase().contains(queryText)),此方法可以正常工作,但如果在第一次迭代中找不到匹配项,该怎么办。然后它将进入else部分,而不会在AllObject列表中循环

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");
    }
public void setFilter(字符串queryText){
visibleObjects=新建ArrayList();
用于(RouteByTMList.Route_ATM项目:主_ATMITMList)
{
if(item.ATMNumber.contains(queryText))
{
visibleObjects.add(项目);
}
}
if(visibleObjects.size()==0){
Toast.makeText(mContext,“未找到搜索结果!”,Toast.LENGTH_SHORT.show();
}
notifyDataSetChanged();
Log.e(“数据集更改”、“数据集更改”);
}

我不反对给定的和公认的答案。存在可能的性能缺陷。应使用
filterable
接口。实现此功能后,将表现为异步执行过滤的ol'good
ListView
。然后,您只需编写自己的
过滤器
,并在重写的
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

}
公共抽象类BaseFilterableRecyclServiceAdapter扩展了RecyclerView。适配器实现了Filterable{
私有上下文;
public BaseFilterableRecyclServiceAdapter(上下文){
this.mContext=上下文;
}
公共摘要无效排序(SortingFilter.sort sortingStrategy);
//…其他方法
}
以及继承的类:

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());
    }

}
公共类ItemAdapter扩展BaseFilterableRecyclServiceAdapter{
//…回收视图方法
@凌驾
公共过滤器getFilter(){
返回新的排序筛选器(mData){
@凌驾
受保护的void publishResults(CharSequence约束、FilterResults结果){
如果(results.values!=null){
int last=mData.size();
mData=(列表)results.values;
notifyDataSetChanged();
}
}
};
}
@凌驾
公共无效排序(SortingFilter.sort sortingStrategy){
getFilter().filter(sortingStrategy.toString());
}
}

IN@Override public boolean onQueryTextChange(String newText){if(text.isEmpty())((ItemAdapter)myRecList.getAdapter.flushFilter();}或OnActionExpandListener.onMenuItemActionCollapse(MenuItem item)searchView.setOnCloseListener()就是这个东西,无论如何谢谢你的评论让我走上了正确的道路@fpopic您能发布您的解决方案吗?我没有时间完成它,因为答案来得太晚,但您是否尝试过这个@merovingen答案,它看起来很好?
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");
    }
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());
    }

}