2017-06-04 33 views
0

我需要通过getFilter方法过滤列表项,在我的Model类中,我有一个名为genre的数组变量。在ListView中使用android搜索字符串数组中的搜索过滤器SearchView

这个流派有时是一个词,有时不止一个与,分开。例如像:

android,iPhone,blackberry

现在在我的代码时,我尝试在我的列表中搜索项目,它将只搜索第一个单词(机器人)。换句话说,如果我尝试搜索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; 
} 

我的另一个问题是:

我如何搜索项目与, seperatted多于一个类型?

例如查询= android,blackberry

,并导致出现与具有这种两个流派

回答

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

你也可以用forach循环更改for循环for dataListFilter。

+0

它适用于单个关键字搜索,但是,当我尝试执行'多关键字'搜索时,它将复制我的过滤列表,而不是第二个关键字的函数。 – DastakWall

+0

如果逗号后有空格,则必须在过滤器字符串上进行修剪 – SAJ

+0

仍然一样,但我会接受您的答案,因为您已经回答了我的主要问题,并且非常感谢。 – DastakWall