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?!
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:
- utiliser les fonctions du
ArrayAdapter
pour modifier la liste sous-jacente(add()
,insert()
,remove()
,clear()
, etc.) - recréer le
ArrayAdapter
avec les nouvelles donnéesList
. (Utilise beaucoup de ressources et de collecte des ordures.) - créez votre propre classe dérivée de
BaseAdapter
etListAdapter
qui permet de changer la structure de données sous-jacenteList
. - utilisez le
notifyDataSetChanged()
chaque fois que la liste est mise à jour. Pour l'appeler sur le UI-Thread, utilisez lerunOnUiThread()
deActivity
. Alors,notifyDataSetChanged()
marchera.
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();
}
});
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 () .
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);
}
}
}
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!