Android 如何在搜索视图中创建筛选系统

Android 如何在搜索视图中创建筛选系统,android,android-recyclerview,searchview,Android,Android Recyclerview,Searchview,我有一个由顶部工具栏中的搜索视图过滤的recyclerview。 如您所见,此recyclerview位于垂直网格中。它包含这些卡片,这些卡片有几个数据,如标题、日期等。 我需要做一个过滤系统,所以如果我写一些以“&”开头的东西: 应用程序识别出你是按日期过滤,而不是按标题搜索 它将在其他文本视图中搜索,如日期 我怎么能这么做 更新 这是我当前的代码,它不工作 //Adapter Code public class TaskAdapter extends Recyc

我有一个由顶部工具栏中的搜索视图过滤的recyclerview。 如您所见,此recyclerview位于垂直网格中。它包含这些卡片,这些卡片有几个数据,如标题、日期等。 我需要做一个过滤系统,所以如果我写一些以“&”开头的东西:

应用程序识别出你是按日期过滤,而不是按标题搜索

它将在其他文本视图中搜索,如日期

我怎么能这么做

更新
这是我当前的代码,它不工作

  //Adapter Code
     public class TaskAdapter extends 
    RecyclerView.Adapter<TaskAdapter.TaskViewHolder> 
    implements Filterable
    {


    private ArrayList<TaskItem> mTaskList;
    private List<TaskItem> fulltasklist;
    public HashMap<Integer, TaskViewHolder> TaskHolders 
    = new HashMap<>();

    public TaskAdapter(ArrayList<TaskItem> exampleList)
    {

        mTaskList = exampleList;
        fulltasklist = new ArrayList<>(exampleList);
    }
    @Override
    public Filter getFilter() {
        return TaskFilter;
    }

    public void setFilter(List<TaskItem> filteredList)
    {
        mTaskList = new ArrayList<>();
        mTaskList.addAll(filteredList);
        notifyDataSetChanged();
    }

    private Filter TaskFilter = new Filter() {
        @Override
        protected FilterResults performFiltering(CharSequence 
        constraint) {
            List<TaskItem> filteredList = new ArrayList<>();

           /* if (constraint == null || constraint.length() == 0)
            {
                filteredList.addAll(fulltasklist);

            }
            else
            {
                String FilterPattern = 
          constraint.toString().toLowerCase().trim();
                for (TaskItem item : fulltasklist)
                {
                    if 
       (item.getTitle().toLowerCase().contains(FilterPattern))
                    {
                        filteredList.add(item);
                    }
                }
            }*/

            FilterResults results = new FilterResults();
            results.values = filteredList;

            return results;
        }


        @Override
        protected void publishResults(CharSequence 
      constraint, FilterResults results) {
            mTaskList.clear();
            mTaskList.addAll((List)results.values);
            notifyDataSetChanged();
        }
    };
}

    //Main Fragment (The one with the recyclerview and 
    toolbar)     

    @Override
    public void onCreateView(@NonNull LayoutInflater 
    inflated, @Nullable View Group container, @Nullable 
    Bundle savedInstanceState) 
   {
    setHasOptionsMenu(true) ;
    View v = inflater.inflate(R.layout.homefragment, 
     container, false);
     mRecyclerView = v.findViewById(R.id.HomeRecycler);
        madap = new TaskAdapter(TaskList);                
      mRecyclerView.setLayoutManager(G);

        mRecyclerView.setHasFixedSize(true);
        mRecyclerView.setNestedScrollingEnabled(false);
        mRecyclerView.setItemViewCacheSize(20);
        mRecyclerView.setDrawingCacheEnabled(true);







  mRecyclerView.setDrawingCacheQuality(View.DRAWING_C 
    ACHE_QUALITY_HIGH);
        mRecyclerView.setAdapter(madap);
    } 

     @Override
      public void onCreateOptionsMenu(Menu menu, 
     MenuInflater inflater)
    {

        menu.clear();
        inflater.inflate(R.menu.home_toolbaritems, menu);


        MenuItem item = menu.findItem(R.id.app_bar_search);
        SearchView searchView = (SearchView) 
       item.getActionView();
        searchView.setMaxWidth(Integer.MAX_VALUE);

        searchView.setOnQueryTextListener(new 
      SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                return false;
            }

            @Override
            public boolean onQueryTextChange(String newText) 
        {
                newText = newText.toLowerCase();
                ArrayList<TaskItem> filteredList = new ArrayList<> 
      ( );

                if (newText.length() == 0 || (newText.length() == 1 
        && newText.equalsIgnoreCase("&")))
                {
                    filteredList.addAll(TaskList);
                }
                else
                {
                    for(TaskItem item : TaskList)
                    {
                        if (newText.charAt(0) == '&')
                        {
                            String date = item.getDate().toLowerCase();
                            if (date.contains(newText))
                            {
                                filteredList.add(item);
                            }
                        }
                        else
                        {
                            String title = item.getTitle().toLowerCase();
                            if (title.contains(newText))
                            {
                                filteredList.add(item);
                            }
                        }
                    }
                }
                madap.setFilter(filteredList);
                return true;
            }
        });
        }
//适配器代码
公共类TaskAdapter扩展
RecyclerView.适配器
可过滤的
{
私有ArrayList mTaskList;
私人名单;
公共HashMap任务负责人
=新HashMap();
公共任务适配器(ArrayList示例列表)
{
mTaskList=示例列表;
fulltasklist=新的ArrayList(示例列表);
}
@凌驾
公共过滤器getFilter(){
返回任务过滤器;
}
公共void setFilter(列表filteredList)
{
mTaskList=newarraylist();
mTaskList.addAll(filteredList);
notifyDataSetChanged();
}
专用筛选器TaskFilter=新筛选器(){
@凌驾
受保护的过滤器结果执行过滤(CharSequence
(限制){
List filteredList=新建ArrayList();
/*if(constraint==null | | constraint.length()==0)
{
filteredList.addAll(完整任务列表);
}
其他的
{
字符串筛选器模式=
constraint.toString().toLowerCase().trim();
用于(任务项:完整任务列表)
{
如果
(item.getTitle().toLowerCase().contains(FilterPattern))
{
filteredList.add(项目);
}
}
}*/
FilterResults results=新的FilterResults();
results.values=filteredList;
返回结果;
}
@凌驾
受保护的无效发布结果(CharSequence
约束、过滤器结果(结果){
mTaskList.clear();
mTaskList.addAll((List)results.values);
notifyDataSetChanged();
}
};
}
//主要片段(带有recyclerview和
(工具栏)
@凌驾
public void onCreateView(@NonNull LayoutInflater)
充气,@Nullable视图组容器,@Nullable
Bundle savedInstanceState)
{
设置选项菜单(真);
视图v=充气机。充气(R.layout.homefragment,
货柜(虚假);;
mRecyclerView=v.findviewbyd(R.id.homecollector);
madap=新任务适配器(任务列表);
mRecyclerView.setLayoutManager(G);
mRecyclerView.setHasFixedSize(true);
mRecyclerView.setNestedScrollingEnabled(false);
mRecyclerView.setItemViewCacheSize(20);
mRecyclerView.setDrawingCacheEnabled(true);
mRecyclerView.setDrawingCacheQuality(View.DRAWING\u C
疼痛(高质量);
mRecyclerView.setAdapter(madap);
} 
@凌驾
public void onCreateOptions菜单(菜单,
梅纽因(充气机)
{
menu.clear();
充气机。充气(右菜单。主菜单项,菜单);
MenuItem=menu.findItem(R.id.app\u bar\u search);
SearchView SearchView=(SearchView)
item.getActionView();
searchView.setMaxWidth(整数.MAX_值);
searchView.setOnQueryTextListener(新建
SearchView.OnQueryTextListener(){
@凌驾
公共布尔值onQueryTextSubmit(字符串查询){
返回false;
}
@凌驾
公共布尔onQueryTextChange(字符串newText)
{
newText=newText.toLowerCase();
ArrayList filteredList=新建ArrayList
( );
如果(newText.length()==0 | |(newText.length()==1
&&newText.equalsIgnoreCase(“&”))
{
filteredList.addAll(任务列表);
}
其他的
{
用于(任务项:任务列表)
{
if(newText.charAt(0)='&')
{
字符串日期=item.getDate().toLowerCase();
如果(日期包含(新文本))
{
filteredList.add(项目);
}
}
其他的
{
字符串标题=item.getTitle().toLowerCase();
if(标题包含(新文本))
{
filteredList.add(项目);
}
}
}
}
madap.setFilter(filteredList);
返回true;
}
});
}

将此代码添加到适配器类中

//replace YourDataModelClass with the class that contains title, date, time etc. as property
public void setFilter(List<YourDataModelClass> filteredList){
    adapterDataList = new ArrayList<>();
    adapterDataList.addAll(filteredList);
    notifyDataSetChanged();
}
//将您的DataModelClass替换为包含标题、日期、时间等属性的类
公共void setFilter(列表filteredList){
adapterDataList=新的ArrayList();
adapterDataList.addAll(filteredList);
notifyDataSetChanged();
}
在活动类中,以这种方式修改searchView的onQueryTextListener,您将获得所需的结果

searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String query) {
            return false;
        }

        @Override
        public boolean onQueryTextChange(String queryText) {

            //Match search query ignoring upper/lower case
            queryText = queryText.toLowerCase();

            //replace YourDataModelClass with the class that contains title, date, time etc. as property
            List<YourDataModelClass> filteredList = new ArrayList<>();

            if(queryText.length() == 0 || (queryText.length() == 1 && queryText.equalsIgnoreCase("&"))) {
                filteredList.addAll(actualList);
            } else {
                for (YourDataModelClass yourDataModelObject: actualList){

                    if(queryText.charAt(0) == '&') {

                        String date = yourDataModelObject.getDate().toLowerCase();
                        if (date.contains(queryText)) {
                            filteredList.add(yourDataModelObject);
                        }

                    } else {

                        String title = yourDataModelObject.getTitle().toLowerCase();
                        if (title.contains(queryText)) {
                            filteredList.add(yourDataModelObject);
                        }

                    }


                }
            }
                mAdapter.setFilter(filteredList);
                return true;
        }

    });
searchView.setOnQueryTextListener(新的searchView.OnQueryTextListener(){
@凌驾
公共布尔值onQueryTextSubmit(字符串查询){
返回false;
}
@凌驾
公共布尔值OnQueryText更改(字符串queryText){
//匹配搜索查询忽略大小写
queryText=queryText.toLowerCase();