Example notifyDataSetChanged

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:

  1. Utilisez les fonctions de ArrayAdapter pour modifier la liste sous-jacente ( add() , insert() , remove() , clear() , etc.)
  2. ArrayAdapter le ArrayAdapter avec les nouvelles données de List . (Utilise beaucoup de ressources et de récupération de place.)
  3. Créez votre propre classe dérivée de BaseAdapter et ListAdapter qui permet de modifier la structure de données List sous-jacente.
  4. Utilisez le 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(yourArrayList)); adapter.notifyDataSetChanged(); 

Classe AdapterHelper

 public class AdapterHelper { @SuppressWarnings({ "rawtypes", "unchecked" }) public void update(ArrayAdapter arrayAdapter, ArrayList listOfObject){ arrayAdapter.clear(); for (Object object : listOfObject){ arrayAdapter.add(object); } } } 

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!