2
votes

Filtrer pour SearchView dans Kotlin

Environnement Android

kotlin_version = '1.3.20'
compileSdkVersion 28

J'ai un adaptateur de type ArrayAdapter qui est représenté par ListView dans le activité de l'application. Comment faire fonctionner le filtre pour SearchView?

Activity.xml

   ...

         searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener {

                    override fun onQueryTextChange(newText: String): Boolean {

                        adapter.filter.filter(newText)

                        return true
                    }

                    override fun onQueryTextSubmit(query: String): Boolean {
                        // task HERE
                        return false
                    }

                })

    ...

Activité. kt

<android.support.v7.widget.SearchView
        android:id="@+id/searchView">
        ...

</android.support.v7.widget.SearchView>


<ListView
        android:id="@+id/listView"
        ...
 />

Donc, setOnQueryTextListener () fonctionne et même l ' adaptateur fonctionne correctement, mais je ne parviens pas à faire fonctionner le filtre.


3 commentaires

Honnêtement, le meilleur moyen est d'utiliser RecyclerView et d'abandonner SearchView pour votre propre code;) mais je sais que ce n'est pas exactement une réponse complète, d'où la raison pour laquelle c'est un commentaire. Je ne pense pas que SearchView jamais ait répondu à mes besoins.


Pouvez-vous publier le code de votre adaptateur?


@EpicPandaForce Merci pour votre suggestion. J'essaierai d'utiliser RecyclerView la prochaine fois. :)


3 Réponses :


0
votes

Ajoutez cette ligne

adapter.notifyDataSetChanged()

Après l'instruction de filtre.


1 commentaires

Merci mais cela fonctionne également sans notifyDataSetChanged (). :) Le problème était avec le bloc entier de setOnQueryTextListener () lui-même. Il devait être en dehors du cadre d'une boucle que j'utilisais pour remplir ma liste.



0
votes

Avertissez l ' adaptateur de la modification des données:

searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener {

                override fun onQueryTextChange(newText: String): Boolean {
                    adapter.filter.filter(newText)
                    adapter.notifyDataSetChanged()
                    return true
                }

                override fun onQueryTextSubmit(query: String): Boolean {
                    return false
                }

            })


1 commentaires

Merci mais cela fonctionne également sans notifyDataSetChanged (). :) Le problème était avec le bloc entier de setOnQueryTextListener () lui-même. Il devait être en dehors du cadre d'une boucle que j'utilisais pour remplir ma liste.



0
votes

<½Solution

La solution à ce problème était plutôt dans la définition de la portée du code elle-même. Pour les personnes qui pourraient tomber sur une situation similaire, assurez-vous de vérifier le searchView.setOnQueryTextListener () et assurez-vous de le garder à l'écart de toutes les boucles que vous pourriez utiliser pour alimenter la liste pour l'adaptateur. :)


0 commentaires