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