在listview中搜索带有android SearchView的字符串数组的过滤器

时间:2017-06-04 11:47:07

标签: android listview filter searchview android-search

我需要通过getFilter方法过滤我的列表项。在我的Model类中,我有一个名为genre的数组变量。

此类型有时是一个单词,有时多个单词用,分隔。例如:

android,iPhone,blackberry

现在在我的代码中,当我尝试在列表中搜索某个项目时,它只会搜索第一个单词( 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;
}

我的另一个问题是:

如何搜索与,分开的多个类型的项目?

例如query = android,blackberry

结果出现了所有具有这两种类型的项目

1 个答案:

答案 0 :(得分:0)

为了部分比较字符串,您可以使用indexOf函数,如下所示。

if(dataNames.getGenre().toLowerCase().indexOf(constraint)>-1){
 //add to your list
 filteredList.add(dataNames);
} else{
  //doesn't satisfy the filter condition. 
}

另一件值得注意的事情是,如果你的getGenre()是一个List,你不需要将所有的字符串加在一起并检查过滤条件,你可以像下面这样做。 您可以将逗号分隔值拆分为列表字符串并循环遍历它并检查过滤器。

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。