2012-04-30 6 views
0

J'ai un tableau de données d'objet de modèle, et j'affiche le texte et l'image dans listview du tableau d'objets de modèle dans mon ArrayAdapter personnalisé. C'est comme la vue de contact android, je veux implémenter la fonctionnalité de recherche.Comment implémenter le filtre pour android listview

Quelqu'un peut-il s'il vous plaît me conseiller, comment mettre en œuvre un filtre pour adaptateur personnalisé qui montre des données de l'objet modèle. Exemple de lien exemple ou extrait de code est également bon exemple.

+2

possible de duper http://stackoverflow.com/questions/2519317/how-to-write-a-custom-filter-for-listview-with-arrayadapter – Femi

+0

Jetez un oeil à la réponse ici http://stackoverflow.com/questions/6492214/custom-filtering-arrayadapter-in-listview – Naruto

+0

Je suis la réponse à mon problème, ici il est http://stackoverflow.com/questions/6492214/custom-filtering- arrayadapter-in-listview – Naruto

Répondre

0

Vous avez juste à filtrer collection sous-jacente (comme ceci: What is the best way to filter a Java Collection?)

Lorsque l'état du filtre passe, vous signalent que cet ensemble de données est modifiée et utiliser instance de liste filtrée pour fournir une quantité d'entrées et des vues individuelles

+0

Hey, merci de répondre. Y a-t-il une API directe à faire? ou nous avons besoin de mettre en œuvre l'interface filtrable? – Naruto

+0

Il y a des références dans un autre article. Mais vous pouvez tout aussi bien faire un filtre ignoré tout en itérant sur la liste originale. Créer une nouvelle liste et y ajouter des valeurs de l'ancien n'est pas cher - cela n'implique pas beaucoup d'allocation de mémoire –

0

En fait, je n'aime pas l'approche où vous dupliquez votre liste d'origine. Cela prend du temps et de la mémoire. J'ai pris l'approche de juste faire les éléments désirés VISIBLE et les éléments indésirables GONE. Mon exemple est pour un TableLayout où je filtre les TableRows, chacun a un TextView.

public void filter(TableLayout tl, String regex) { 
    TableRow tr; 
    TextView tv; 
    Pattern p; 
    Matcher m; 

    p = Pattern.compile(regex); 
    int n = tl.getChildCount(); 
    for(int i = 0; i < n; i++) { 
     tr = (TableRow) tl.getChildAt(i); 
     tv = (TextView) tr.getChildAt(0); 
     m = p.matcher(tv.getText()); 
     if(m.find()) { 
      tr.setVisibility(View.VISIBLE); 
     } else { 
      tr.setVisibility(View.GONE); 
    } 
} 

Je ne suis pas le profil, mais je suis tout à fait sûr qu'il est plus rapide que la copie de tous les éléments d'une liste, puis filtrer et puis afficher la nouvelle liste.

L'avantage devrait être plus perceptible à mesure que votre liste s'agrandit. Mais, une mise en garde, je dois avouer que bien qu'il fonctionne très bien en filtrant quelques centaines de lignes, je suis préoccupé par ce qui se passe quand le nombre de lignes est si grand qu'il faut plus de 5 secondes pour faire le filtrage . Il devrait ensuite déclencher le dialogue de l'application ne répond pas.
J'ai essayé de faire un fil, mais parce que je traite directement de la visibilité des vues, je reçois un message d'erreur que seul le fil d'origine peut toucher les vues. Je travaille dessus et je suis sûr que je trouverai une solution.

Questions connexes