web-dev-qa-db-fra.com

Exemple notifyDataSetChanged

J'essaie d'utiliser dans mon 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 fonctionner 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?!

158
Tima

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

Quand un ArrayAdapter est construit, il contient la référence pour le List qui a été passé. Si vous deviez passer un List qui était membre d'une activité, et changez cette activité. membre plus tard, le ArrayAdapter contient toujours une référence au List original. L'adaptateur ne sait pas que vous avez changé le List dans l'activité.

Vos choix sont:

  1. Utilisez les fonctions de ArrayAdapter pour modifier la liste sous-jacente (add(), insert(), remove(), clear(), etc.).
  2. Recréez la ArrayAdapter avec les nouvelles données 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 permettant de modifier la structure de données List sous-jacente.
  4. Utilisez la notifyDataSetChanged() chaque fois que la liste est mise à jour. Pour l'appeler sur le UI-Thread, utilisez la runOnUiThread() de Activity. Ensuite, notifyDataSetChanged() fonctionnera.
319
jnosek

Vous pouvez utiliser la méthode runOnUiThread() comme suit. Si vous n'utilisez pas de 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();
    }
});
31
Brian

J'ai récemment écrit sur ce sujet, bien que ce message soit ancien, j'ai pensé qu'il serait utile pour 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 nouveau blog BaseAdapter.notifyDataSetChanged () .

11
Arif Nadeem

J'ai eu le même problème et je préfère ne pas remplacer tout le ArrayAdapter avec une nouvelle instance en continu. Ainsi, j'ai le AdapterHelper faire le poids lourd ailleurs.

Ajoutez ceci où vous appelleriez normalement informer

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);
        }
    }
}
6
Kevin Parker

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 liste dans un onglet de la barre d'action (fragment) avec le contenu renvoyé par une activité complètement différente. Initialement cependant, la liste ne refléterait aucun changement. Cependant, lorsque j'ai cliqué sur un autre onglet puis que je suis retourné à l'onglet souhaité, la listview a été 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 barre d'actions dans le code de l'activité qui devait renvoyer les données.

C'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 elle mettrait directement à jour ma liste de vues dans FragmentTab2.

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

2
mutp