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?!
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:
ArrayAdapter
pour modifier la liste sous-jacente (add()
, insert()
, remove()
, clear()
, etc.).ArrayAdapter
avec les nouvelles données List
. (Utilise beaucoup de ressources et de récupération de place.)BaseAdapter
et ListAdapter
permettant de modifier la structure de données List
sous-jacente.notifyDataSetChanged()
chaque fois que la liste est mise à jour. Pour l'appeler sur le UI-Thread, utilisez la runOnUiThread()
de Activity
. Ensuite, notifyDataSetChanged()
fonctionnera.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();
}
});
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 () .
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);
}
}
}
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!