2017-06-04 3 views
0

Ich muss meine Listenelemente über GetFilter-Methode filtern, in meiner Model-Klasse habe ich eine Array-Variable mit dem Namen genre.Suchfilter in ListView für Array von Zeichenfolgen mit Android SearchView

Dieses Genre ist manchmal ein Wort, und manchmal mehr als eins getrennt mit ,. Zum Beispiel:

Android, iPhone, BlackBerry.

in meinem Code Nun, wenn ich versuche, für einen Eintrag in meiner Liste suchen, es wird nur das erste Wort suchen (android). Mit anderen Worten, wenn ich versuche, nach dem iPhone zu suchen, wird dieses Element nicht in meiner neuen gefilterten Liste angezeigt.

Im unteren Code weiß ich, dass ich es falsch mache, aber können Sie mir bitte helfen, es zu korrigieren?

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

Und meine andere Frage ist:

Wie ich nach Artikeln mit mehr als einem Genre mit , seperatted suchen?

Zum Beispiel query = android,blackberry

und Ergebnis kommt mit allen Einzelteilen bis, dass diese beiden Genres

Antwort

0

Für die Saiten teilweise zu vergleichen können Sie die indexOf Funktion wie unten verwenden.

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

Eine andere Sache aufgefallen ist, dass, wenn Ihr getGenre() ist eine Liste brauchen Sie nicht alle zusammen die Zeichenfolge hinzuzufügen und die Filterbedingung überprüfen Sie es wie unten tun können. Sie können den durch Komma getrennten Wert in eine Listenzeichenfolge aufteilen und durchlaufen und Filter überprüfen.

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

Sie können auch die for-Schleife mit foreach für das Schleifen von DataListFilter ändern.

+0

Es funktioniert für einzelne Stichwortsuche, aber wenn ich versuche, Multi-Keyword-Suche zu machen Es wird meine gefilterte Liste duplizieren und nicht für das zweite Keyword funktionieren. – DastakWall

+0

Wenn Platz nach Komma ist, müssen Sie die Filterstring trimmen – SAJ

+0

Immer noch das gleiche, aber ich werde Ihre Antwort akzeptieren, weil Sie bereits meine Hauptfrage beantwortet, und vielen Dank. – DastakWall