2017-06-04 2 views
0

J'ai besoin de filtrer mes éléments de liste via la méthode getFilter, Dans ma classe Model, j'ai une variable de tableau nommé genre.Filtre de recherche dans listview pour un tableau de chaînes avec android SearchView

Ce genre est parfois un seul mot, et parfois plus d'un est séparé par ,. Par exemple:

android, iPhone, blackberry.

Maintenant dans mon code lorsque je tente de chercher dans ma liste pour un produit, il ne recherche que le premier mot (android). En d'autres termes, si j'essaie de rechercher un iPhone, cet élément n'apparaîtra pas dans ma nouvelle liste filtrée.

Dans le code ci-dessous, je sais que je me trompe, mais pouvez-vous m'aider à corriger, s'il vous plaît?

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

Et mon autre question est la suivante:

Comment puis-je rechercher des articles avec plus d'un genre seperatted avec ,?

Par exemple query = android,blackberry

et le résultat vient avec tous les éléments qui ont ces deux genres

Répondre

0

pour comparer les chaînes que vous pouvez utiliser en partie la fonction indexOf comme ci-dessous.

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

Une autre chose est remarqué que si votre getGenre() est une liste que vous n'avez pas besoin d'ajouter toute la chaîne ensemble et vérifier l'état du filtre, vous pouvez le faire comme ci-dessous. Vous pouvez diviser la valeur séparée par des virgules en une chaîne de liste et la parcourir pour vérifier le filtre.

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

Vous pouvez également modifier la boucle for avec foreach pour la mise en boucle de dataListFilter.

+0

Cela fonctionne pour la recherche par mot-clé unique, mais lorsque j'essaie de faire une recherche multi-mots-clés, elle va dupliquer ma liste filtrée et ne pas fonctionner pour le second mot-clé. – DastakWall

+0

S'il y a de l'espace après la virgule, vous devez mettre la garniture sur la chaîne de filtre – SAJ

+0

Toujours la même chose, mais je vais accepter votre réponse parce que vous avez déjà répondu à ma question principale, et merci beaucoup. – DastakWall