exemple de modification des données

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

j'ai trouvé comme réponse ici , que notifyDataSetChanged() devrait fonctionner dans le fil principal, mais il n'y avait aucun exemple pour cela.

quelqu'un Pourrait-il envoyer un exemple ou au moins un lien?!

147
demandé sur Community 2010-09-08 19:27:44

5 réponses

pour un ArrayAdapter , notifyDataSetChanged fonctionne seulement si vous utilisez le add() , insert() , remove() , et clear() sur L'Adaptateur.

quand un ArrayAdapter est construit, il tient la référence pour le List qui a été passé dans. Si vous deviez passer dans un List qui était un membre d'une activité, et changer ce membre d'activité plus tard, le ArrayAdapter contient toujours une référence à l'original List . La Carte ne vous connais pas changé le List dans l'Activité.

vos choix sont:

  1. utiliser les fonctions du ArrayAdapter pour modifier la liste sous-jacente( add() , insert() , remove() , clear() , etc.)
  2. recréer le ArrayAdapter avec les nouvelles données List . (Utilise beaucoup de ressources et de collecte des ordures.)
  3. créez votre propre classe dérivée de BaseAdapter et ListAdapter qui permet de changer la structure de données sous-jacente List .
  4. utilisez le notifyDataSetChanged() chaque fois que la liste est mise à jour. Pour l'appeler sur le UI-Thread, utilisez le runOnUiThread() de Activity . Alors, notifyDataSetChanged() marchera.
305
répondu jnosek 2014-06-03 07:11:05

vous pouvez utiliser la méthode 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();
    }
});
28
répondu Brian 2016-11-30 16:31:23

j'ai récemment écrit sur ce sujet, bien que ce post it old, j'ai pensé qu'il sera utile à quelqu'un qui veut savoir comment mettre en œuvre BaseAdapter.notifyDataSetChanged() étape par étape et d'une manière correcte.

s'il vous Plaît suivre Comment implémenter correctement BaseAdapter.notifyDataSetChanged() dans Android ou le plus récent blog de BaseAdapter.notifydatase changed () .

9
répondu Arif Nadeem 2014-06-15 11:14:52

j'ai eu le même problème et je préfère ne pas remplacer tout le tableau avec une nouvelle instance en continu. J'ai donc demandé à L'Adaptateur de faire le levage lourd ailleurs.

ajouter cette où vous devriez normalement (essayer) appeler notifier

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

Classe Adaptateur

public class AdapterHelper {
    @SuppressWarnings({ "rawtypes", "unchecked" })
    public void update(ArrayAdapter arrayAdapter, ArrayList<Object> listOfObject){
        arrayAdapter.clear();
        for (Object object : listOfObject){
            arrayAdapter.add(object);
        }
    }
}
6
répondu Kevin Parker 2011-12-13 21:08:11

je sais qu'il s'agit d'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 un listview dans un onglet Barre d'action (fragment) avec des contenus retournés à partir d'une activité complètement différente. Au départ, cependant, listview ne refléterait aucun changement. Cependant, quand j'ai cliqué sur un autre onglet et puis retourné à l'onglet désiré, le listview sera mis à jour avec le contenu de l'autre activité. Pour résoudre ce problème, j'ai utilisé notifyDataSetChanged() de l'adaptateur de barre d'action dans le code de l'activité qui devait retourner 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é retournerait certaines données à FragmentTab2 et mettrait directement à jour mon listview dans FragmentTab2 .

Espère que quelqu'un trouve cette pratique!

2
répondu mutp 2016-11-30 16:32:24