J’essaie d’utiliser dans ma Android Application
la méthode notifyDataSetChanged()
pour un ArrayAdapter
mais cela ne fonctionne pas pour moi.
J’ai trouvé comme réponse ici , que notifyDataSetChanged()
devrait s’exécuter dans le thread principal, mais il n’y avait pas d’exemple pour cela.
Quelqu’un pourrait-il envoyer un exemple ou au moins un lien?!
Pour un ArrayAdapter
, notifyDataSetChanged
ne fonctionne que si vous utilisez add()
, insert()
, remove()
et clear()
sur l’adaptateur.
Lorsqu’un ArrayAdapter
est construit, il contient la référence de la List
transmise. Si vous deviez transmettre une List
qui était membre d’une activité et modifier ultérieurement ce membre Activity, ArrayAdapter
toujours une référence à la liste. List
origine L’adaptateur ne sait pas que vous avez modifié la List
dans l’activité.
Vos choix sont les suivants:
ArrayAdapter
pour modifier la liste sous-jacente ( add()
, insert()
, remove()
, clear()
, etc.) ArrayAdapter
le ArrayAdapter
avec les nouvelles données de List
. (Utilise beaucoup de ressources et de récupération de place.) BaseAdapter
et ListAdapter
qui permet de modifier la structure de données List
sous-jacente. notifyDataSetChanged()
chaque fois que la liste est mise à jour. Pour l’appeler sur le thread d’interface utilisateur, utilisez le runOnUiThread()
de l’ Activity
. Puis, notifyDataSetChanged()
fonctionnera. Vous pouvez utiliser la méthode runOnUiThread()
comme suit. Si vous n’utilisez pas ListActivity
, adaptez simplement le code pour obtenir une référence à votre ArrayAdapter
.
final ArrayAdapter adapter = ((ArrayAdapter)getListAdapter()); runOnUiThread(new Runnable() { public void run() { adapter.notifyDataSetChanged(); } });
J’ai récemment écrit sur ce sujet, même si cet article est ancien, j’ai pensé qu’il serait utile pour quelqu’un qui veut savoir comment implémenter BaseAdapter.notifyDataSetChanged()
pas à pas et de manière correcte.
Veuillez suivre comment implémenter correctement BaseAdapter.notifyDataSetChanged () dans Android ou le blog plus récent BaseAdapter.notifyDataSetChanged () .
J’ai eu le même problème et je préfère ne pas remplacer la totalité d’ArrayAdapter par une nouvelle instance en continu. Ainsi, le AdapterHelper fait le gros du travail ailleurs.
Ajoutez ceci où vous devriez normalement (essayer de) notifier l’appel
new AdapterHelper().update((ArrayAdapter)adapter, new ArrayList
Classe AdapterHelper
public class AdapterHelper { @SuppressWarnings({ "rawtypes", "unchecked" }) public void update(ArrayAdapter arrayAdapter, ArrayList
Je sais que c’est une réponse tardive mais je faisais face à un problème similaire et j’ai réussi à le résoudre en utilisant notifyDataSetChanged()
au bon endroit.
Donc, ma situation était la suivante.
J’ai dû mettre à jour une vue de liste dans un onglet de la barre d’action (fragment) avec le contenu renvoyé par une activité complètement différente. Au départ, la vue liste ne refléterait aucun changement. Cependant, lorsque je cliquais sur un autre onglet et que je revenais à l’onglet souhaité, la vue de liste serait mise à jour avec le contenu correct de l’autre activité. Donc, pour résoudre ce problème, j’ai utilisé notifyDataSetChanged()
de l’adaptateur de la barre d’action dans le code de l’activité qui devait renvoyer les données.
Ceci est l’extrait de code que j’ai utilisé dans l’activité.
@Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.action_new_forward: FragmentTab2.mListAdapter.notifyDataSetChanged();//this updates the adapter in my action bar tab Intent ina = new Intent(getApplicationContext(), MainActivity.class); ina.putExtra("stra", values1); startActivity(ina);// This is the code to start the parent activity of my action bar tab(fragment). } }
Cette activité renverrait des données à FragmentTab2
et mettrait directement à jour ma liste dans FragmentTab2
.
J’espère que quelqu’un trouve cela utile!