web-dev-qa-db-fra.com

android Mise à jour des éléments ArrayAdapter

J'ai ArrayAdapter avec cette structure d'éléments:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout ... >

         <TextView
             Android:id="@+id/itemTextView"
             ... />
</RelativeLayout>

Et ajoutez cet adaptateur pour:

mAdapter = new ArrayAdapter<String>(this, R.layout.item, 
                                            R.id.itemTextView, itemsText);

Tout va bien mais je veux mettre à jour le texte dans les éléments de l'adaptateur. J'ai trouvé une solution

mAdapter.notifyDataSetChanged();

mais ne comprends pas comment l'utiliser. Aidez-moi, s'il vous plaît.

pd Mon code:

String[] itemsText = {"123", "345", "567"};
ArrayAdapter<String> mAdapter;

onCreate

mAdapter = new ArrayAdapter<String>(this, R.layout.roomitem, 
                                              R.id.itemTextView, itemsText);
setListAdapter(mAdapter);
itemsText = {"789", "910", "1011"};

sur clic

mAdapter.notifyDataSetChanged();
//it's dont work
17
Leo

Je pense que quelque chose comme ça

public void updatedData(List itemsArrayList) {

    mAdapter.clear(); 

    if (itemsArrayList != null){

        for (Object object : itemsArrayList) {

            mAdapter.insert(object, mAdapter.getCount());
        }
    }

    mAdapter.notifyDataSetChanged();

}
39
Luciano

Votre problème est une erreur typique Java avec les pointeurs.

Dans un premier temps, vous créez un tableau et passez ce tableau à l'adaptateur.

Dans la deuxième étape, vous créez un nouveau tableau (donc un nouveau pointeur est créé) avec de nouvelles informations mais l'adaptateur pointe toujours vers le tableau d'origine.

// init itemsText var and pass to the adapter
String[] itemsText = {"123", "345", "567"};
mAdapter = new ArrayAdapter<String>(..., itemsText);

//ERROR HERE: itemsText variable will point to a new array instance
itemsText = {"789", "910", "1011"};

Ainsi, vous pouvez faire deux choses, une, mettre à jour le contenu du tableau au lieu d'en créer une nouvelle:

//This will work for your example
items[0]="123";
items[1]="345";
items[2]="567";

... ou ce que je ferais, utiliser une liste, quelque chose comme:

List<String> items= new ArrayList<String>(3);
boundedDevices.add("123");
boundedDevices.add("456");
boundedDevices.add("789");

Et dans la mise à jour:

boundedDevices.set("789");
boundedDevices.set("910");
boundedDevices.set("1011");

Pour ajouter plus d'informations, dans une application réelle, vous mettez normalement à jour le contenu de l'adaptateur de liste avec les informations d'un service ou d'un fournisseur de contenu, donc normalement pour mettre à jour les éléments, vous feriez quelque chose comme:

//clear the actual results
items.clear()

//add the results coming from a service
items.addAll(serviceResults);

Avec cela, vous effacerez les anciens résultats et chargerez les nouveaux (pensez que les nouveaux résultats devraient avoir un nombre différent d'éléments).

Et bien sûr, après la mise à jour des données, l'appel à notifyDataSetChanged();

En cas de doute, n'hésitez pas à commenter.

40
Carlos Verdes

En supposant que itemTexts soit un tableau String ou String ArrayList, où vous ajoutez de nouveaux éléments dans itemsTextat cette fois-là, vous pouvez appeler

mAdapter.notifyDataSetChanged();

Si vous n'avez pas obtenu de réponse, veuillez mettre du code.

4
Android Killer