180 votes

Exemple de notifyDataSetChanged

Que j'essaie d'utiliser dans mon Android Application le site notifyDataSetChanged() méthode pour un ArrayAdapter mais ça ne marche pas pour moi.

J'ai trouvé comme réponse ici que notifyDataSetChanged() devrait s'exécuter 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 ? !

341voto

jnosek Points 2315

Pour un ArrayAdapter , notifyDataSetChanged ne fonctionne que si vous utilisez l'option add() , insert() , remove() y clear() sur l'adaptateur.

Lorsqu'un ArrayAdapter est construit, il contient la référence pour le List qui a été adopté. Si vous deviez passer dans un List qui était membre d'une activité, et changer ce membre d'activité par la suite, la ArrayAdapter contient toujours une référence à l'original List . L'adaptateur ne sait pas que vous avez modifié le List dans l'activité.

Vous avez le choix :

  1. Utilisez les fonctions de l ArrayAdapter pour modifier la liste sous-jacente ( add() , insert() , remove() , clear() etc.)
  2. Recréer le ArrayAdapter avec le nouveau List données. (Utilise beaucoup de ressources et de garbage collection).
  3. Créez votre propre classe dérivée de BaseAdapter y ListAdapter qui permet de changer le sous-jacent List structure de données.
  4. Utilisez le notifyDataSetChanged() à chaque fois que la liste est mise à jour. Pour l'appeler sur le UI-Thread, utilisez la fonction runOnUiThread() de Activity . Alors, notifyDataSetChanged() fonctionnera.

36voto

Brian Points 7157

Vous pouvez utiliser le runOnUiThread() comme suit. Si vous n'utilisez pas un ListActivity il suffit d'adapter le code pour obtenir une référence à votre ArrayAdapter .

final ArrayAdapter adapter = ((ArrayAdapter)getListAdapter());
runOnUiThread(new Runnable() {
    public void run() {
        adapter.notifyDataSetChanged();
    }
});

12voto

Arif Nadeem Points 2607

J'ai récemment écrit sur ce sujet. Bien que cet article soit ancien, j'ai pensé qu'il serait utile à quelqu'un qui veut savoir comment mettre en œuvre la stratégie de l'UE. BaseAdapter.notifyDataSetChanged() étape par étape et de manière correcte.

Veuillez suivre Comment implémenter correctement BaseAdapter.notifyDataSetChanged() dans Android ? o le blog plus récent BaseAdapter.notifyDataSetChanged() .

7voto

Kevin Points 4235

J'ai eu le même problème et je préfère ne pas remplacer l'intégralité de l'ArrayAdapter par une nouvelle instance en permanence. Je demande donc à l'AdapterHelper de faire le gros du travail ailleurs.

Ajoutez ceci là où vous devriez normalement (essayer) d'appeler notify

new AdapterHelper().update((ArrayAdapter)adapter, new ArrayList<Object>(yourArrayList));
adapter.notifyDataSetChanged();

Classe AdapterHelper

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

3voto

adkap Points 1

Je sais que c'est une réponse tardive mais j'ai été 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.

Je devais mettre à jour une vue de liste dans un onglet de barre d'action (fragment) avec le contenu renvoyé par une activité complètement différente. Au départ, le listview ne reflétait aucun changement. Cependant, lorsque je cliquais sur un autre onglet, puis revenais à l'onglet souhaité, la liste était mise à jour avec le contenu correct de l'autre activité. Pour résoudre ce problème, j'ai donc utilisé notifyDataSetChanged() de l'adaptateur de la barre d'action dans le code de l'activité qui devait retourner les données.

Voici 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 cela mettrait directement à jour mon listview dans FragmentTab2 .

J'espère que quelqu'un trouvera cela utile !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X