使用 android SearchView 在列表视图中搜索字符串数组的过滤器
Search filter in listview for array of strings with android SearchView
我需要通过 getFilter 方法过滤我的列表项,在我的模型 class 中,我有一个名为 genre
.
的数组变量
这个流派有时是一个词,有时是多个,用,
隔开。例如:
android,iPhone,黑莓.
现在在我的代码中,当我尝试在列表中搜索某个项目时,它只会搜索第一个词(android )。换句话说,如果我尝试搜索 iPhone,该项目将不会显示在我的新过滤列表中。
在下面的代码中我知道我做错了,但是你能帮我改正吗?
@Override
public Filter getFilter() {
Filter filter = new Filter() {
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
dataList = (List<ProductLocal>) results.values;
notifyDataSetChanged();
}
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults results = new FilterResults();
List<ProductLocal> filteredList = new ArrayList<>();
constraint = constraint.toString().toLowerCase();
for (int i = 0; i < dataListFilter.size(); i++) {
ProductLocal dataNames = dataListFilter.get(i);
String genreStr = "";
for (String str : dataNames.getGenre()) {
genreStr += str;
}
genreStr = genreStr.length() > 0 ? genreStr.substring(0,genreStr.length() - 2) : genreStr;
if (genreStr.toLowerCase().startsWith(constraint.toString()) ) {
filteredList.add(dataNames);
}
}
results.count = filteredList.size();
results.values = filteredList;
return results;
}
};
return filter;
}
我的另一个问题是:
如何搜索具有多个类型且以 ,
分隔的项目?
例如查询=android,blackberry
结果是所有具有这两种类型的项目
要部分比较字符串,您可以使用如下所示的 indexOf 函数。
if(dataNames.getGenre().toLowerCase().indexOf(constraint)>-1){
//add to your list
filteredList.add(dataNames);
} else{
//doesn't satisfy the filter condition.
}
另一件值得注意的事情是,如果您的 getGenre() 是一个列表,您不需要将所有字符串加在一起并检查过滤条件,您可以像下面那样进行操作。
您可以将逗号分隔值拆分为列表字符串并循环遍历它并检查过滤器。
List<String> filterList = Arrays.asList(constraint.split(","))
bool hasAdded;
for (String str : dataNames.getGenre())
{
for (String filter : filterList) {
if(str.toLowerCase().indexOf(filter.trim().toLowerCase())>-1){
//add to your list
filteredList.add(dataNames);
hasAdded = true;
break;
}
if(hasAdded) break;
}
}
您也可以使用 foreach 更改 for 循环以循环 dataListFilter。
我需要通过 getFilter 方法过滤我的列表项,在我的模型 class 中,我有一个名为 genre
.
这个流派有时是一个词,有时是多个,用,
隔开。例如:
android,iPhone,黑莓.
现在在我的代码中,当我尝试在列表中搜索某个项目时,它只会搜索第一个词(android )。换句话说,如果我尝试搜索 iPhone,该项目将不会显示在我的新过滤列表中。
在下面的代码中我知道我做错了,但是你能帮我改正吗?
@Override
public Filter getFilter() {
Filter filter = new Filter() {
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
dataList = (List<ProductLocal>) results.values;
notifyDataSetChanged();
}
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults results = new FilterResults();
List<ProductLocal> filteredList = new ArrayList<>();
constraint = constraint.toString().toLowerCase();
for (int i = 0; i < dataListFilter.size(); i++) {
ProductLocal dataNames = dataListFilter.get(i);
String genreStr = "";
for (String str : dataNames.getGenre()) {
genreStr += str;
}
genreStr = genreStr.length() > 0 ? genreStr.substring(0,genreStr.length() - 2) : genreStr;
if (genreStr.toLowerCase().startsWith(constraint.toString()) ) {
filteredList.add(dataNames);
}
}
results.count = filteredList.size();
results.values = filteredList;
return results;
}
};
return filter;
}
我的另一个问题是:
如何搜索具有多个类型且以 ,
分隔的项目?
例如查询=android,blackberry
结果是所有具有这两种类型的项目
要部分比较字符串,您可以使用如下所示的 indexOf 函数。
if(dataNames.getGenre().toLowerCase().indexOf(constraint)>-1){
//add to your list
filteredList.add(dataNames);
} else{
//doesn't satisfy the filter condition.
}
另一件值得注意的事情是,如果您的 getGenre() 是一个列表,您不需要将所有字符串加在一起并检查过滤条件,您可以像下面那样进行操作。 您可以将逗号分隔值拆分为列表字符串并循环遍历它并检查过滤器。
List<String> filterList = Arrays.asList(constraint.split(","))
bool hasAdded;
for (String str : dataNames.getGenre())
{
for (String filter : filterList) {
if(str.toLowerCase().indexOf(filter.trim().toLowerCase())>-1){
//add to your list
filteredList.add(dataNames);
hasAdded = true;
break;
}
if(hasAdded) break;
}
}
您也可以使用 foreach 更改 for 循环以循环 dataListFilter。