Je suis en train d'utiliser dans mon Android Application
la notifyDataSetChanged()
méthode pour un , ArrayAdapter
mais il ne fonctionne pas pour moi.
J'ai trouvé comme réponse ici , qui notifyDataSetChanged()
devrait fonctionner dans le fil principal, mais il n'y avait pas d'exemple pour cela.
Quelqu'un pourrait-il envoyer un exemple ou au moins un lien?!
Réponses:
Pour un
ArrayAdapter
,notifyDataSetChanged
ne fonctionne que si vous utilisezadd()
,insert()
,remove()
etclear()
sur l'adaptateur.Quand un
ArrayAdapter
est construit, il contient la référence pour leList
qui a été transmis. Si vous deviez transmettre unList
qui était un membre d'une activité et changer ce membre d'activité ultérieurement, le contientArrayAdapter
toujours une référence à l'originalList
. L'adaptateur ne sait pas que vous avez modifié leList
dans l'activité.Vos choix sont:
ArrayAdapter
modifier la liste sous - jacente (add()
,insert()
,remove()
,clear()
, etc.)ArrayAdapter
avec les nouvellesList
données. (Utilise beaucoup de ressources et de garbage collection.)BaseAdapter
etListAdapter
qui permet de modifier laList
structure de données sous-jacente .notifyDataSetChanged()
chaque fois que la liste est mise à jour. Pour l'appeler sur UI-Thread, utilisez lerunOnUiThread()
ofActivity
. Ensuite,notifyDataSetChanged()
fonctionnera.la source
notifyDataSetChanged()
de cette manière((BaseAdapter) arrayAdapter).notifyDataSetChanged();
:?Vous pouvez utiliser la
runOnUiThread()
méthode comme suit. Si vous n'utilisez pas aListActivity
, adaptez simplement le code pour obtenir une référence à votreArrayAdapter
.la source
J'ai récemment écrit sur ce sujet, bien que ce post soit vieux, j'ai pensé qu'il serait utile à quelqu'un qui veut savoir comment mettre en œuvre
BaseAdapter.notifyDataSetChanged()
étape par étape et de manière correcte.Veuillez suivre Comment implémenter correctement BaseAdapter.notifyDataSetChanged () dans Android ou le blog plus récent BaseAdapter.notifyDataSetChanged () .
la source
mItem.add()
, je n'ai fait que modifier un élément signifie que c'estmItem.get(position).setImage(encodedImage)
peut-être pour cela qu'il donne une erreur NullPointer exeption.Alors, notifyDataSetChange fonctionne simplement en le modifiant, bcz pour l'adaptateur Array, il est mentionné ci-dessus, cela fonctionne uniquement pour add (), clear (), remove () etcJ'ai eu le même problème et je préfère ne pas remplacer l'ensemble de l'ArrayAdapter par une nouvelle instance en continu. Ainsi, je demande à AdapterHelper de faire le gros du travail ailleurs.
Ajoutez ceci là où vous appelleriez normalement (essayez d'appeler) notifier
Classe AdapterHelper
la source
super.addAll(..)
pour API> 11 et super.add (.. ) en combinaison avec itération comme le vôtre:if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { super.addAll(items); } else { for (Object o : collection) { super.add(o); } }
. Maintenant, étendez simplement votre nouvelle classe d'adaptateur.Je sais que c'est une réponse tardive, mais j'étais confronté à un problème similaire et j'ai réussi à le résoudre en utilisant
notifyDataSetChanged()
au bon endroit.Ma situation était donc la suivante.
J'ai dû mettre à jour une liste dans un onglet de la barre d'action (fragment) avec le contenu renvoyé par une activité complètement différente. Cependant, au départ, la vue de liste ne refléterait aucun changement. Cependant, lorsque je cliquais sur un autre onglet, puis retournais à l'onglet souhaité, la liste était mise à jour avec le contenu correct de l'autre activité. Donc, pour résoudre ce problème, j'ai utilisé
notifyDataSetChanged()
l'adaptateur de barre d'action dans le code de l'activité qui devait renvoyer les données.Voici l'extrait de code que j'ai utilisé dans l'activité.
Cette activité renverrait des données à
FragmentTab2
et mettrait directement à jour ma liste dansFragmentTab2
.J'espère que quelqu'un trouvera cela utile!
la source