Sur Android, comment puis-je ListView
filtrer en fonction de l'entrée de l'utilisateur, où les éléments affichés sont mis à jour dynamiquement en fonction de la TextView
valeur?
Je cherche quelque chose comme ça:
-------------------------
| Text View |
-------------------------
| List item |
| List item |
| List item |
| List item |
| |
| |
| |
| |
-------------------------
Réponses:
Tout d'abord, vous devez créer une mise en page XML qui a à la fois un EditText et un ListView.
Cela mettra tout en place correctement, avec un joli EditText au-dessus de ListView. Ensuite, créez un ListActivity comme vous le feriez normalement, mais ajoutez un
setContentView()
appel à laonCreate()
méthode afin que nous utilisions notre disposition récemment déclarée. N'oubliez pas que nous avons identifié leListView
spécialement, avecandroid:id="@android:id/list"
. Cela permet auListActivity
de savoir ce queListView
nous voulons utiliser dans notre mise en page déclarée.L'exécution de l'application maintenant devrait afficher votre précédente
ListView
, avec une belle boîte au-dessus. Pour que cette boîte fasse quelque chose, nous devons en extraire l'entrée et faire en sorte que cette entrée filtre la liste. Bien que beaucoup de gens aient essayé de le faire manuellement, la plupart desListView
Adapter
classes sont livrées avec unFilter
objet qui peut être utilisé pour effectuer le filtrage automatiquement. Nous avons juste besoin de canaliser l'entrée duEditText
vers leFilter
. Il s'avère que c'est assez facile. Pour exécuter un test rapide, ajoutez cette ligne à votreonCreate()
appelNotez que vous devrez enregistrer votre fichier
ListAdapter
dans une variable pour que cela fonctionne - j'ai enregistré monArrayAdapter<String>
de plus tôt dans une variable appelée «adaptateur».L'étape suivante consiste à obtenir l'entrée du
EditText
. Cela demande un peu de réflexion. Vous pouvez ajouter unOnKeyListener()
à votreEditText
. Cependant, cet écouteur ne reçoit que certains événements clés . Par exemple, si un utilisateur entre «wyw», le texte prédictif recommandera probablement «eye». Tant que l'utilisateur ne choisit pas «wyw» ou «eye», vousOnKeyListener
ne recevrez pas d'événement clé. Certains préfèrent peut-être cette solution, mais je l'ai trouvée frustrante. Je voulais chaque événement clé, donc j'avais le choix entre filtrer ou non filtrer. La solution est unTextWatcher
. Créez simplement et ajoutez unTextWatcher
àEditText
, et transmettez laListAdapter
Filter
demande de filtre à chaque fois que le texte change. N'oubliez pas de supprimer leTextWatcher
inOnDestroy()
! Voici la solution finale:la source
l'exécution du programme provoquera une fermeture forcée.
J'ai échangé la ligne:
avec
Est-ce que cela pourrait être le problème? À quoi sert la '@ + building_list'?
la source
J'ai eu un problème avec le filtrage, les résultats ont été filtrés, mais pas restaurés !
donc avant le filtrage (début de l'activité) j'ai créé une sauvegarde de liste .. (juste une autre liste, contenant les mêmes données)
lors du filtrage, le filtre et l'adaptateur de liste sont connectés à la liste principale.
mais le filtre lui-même utilisait les données de la liste sauvegardée.
cela garantissait dans mon cas que la liste était mise à jour immédiatement et même en supprimant les caractères des termes de recherche, la liste était restaurée avec succès dans tous les cas :)
merci pour cette solution de toute façon.
la source