2010-07-22 4 views
8

Est-il possible de mettre à jour un SimpleAdapter? J'ai une liste de données et un pied de page qui dit "Voir les résultats suivants" Lorsque cet élément de la liste est cliqué, je capture l'événement et obtenir de nouvelles données. Je veux ensuite remplacer les données dans le ListView avec ces nouvelles données, mais je ne peux pas comprendre comment le faire. Des idées? Je ne veux pas utiliser un ArrayAdapter, car autant que je peux voir les éléments ne peuvent contenir qu'une seule chaîne où j'en ai besoin pour contenir plusieurs chaînes et ints.Comment mettre à jour SimpleAdapter sous Android

Répondre

10

Mise à jour: Selon del116, vous pouvez en effet donner SimpleAdapter une carte mutable puis appeler manuellement notifyDataSetChanged de l'adaptateur méthode lorsque vous avez besoin de la liste mise à jour. Cependant, mon point ci-dessous se tient à propos de la documentation de SimpleAdapter spécifiant qu'il s'agit de données statiques; l'utiliser pour les données mutables va à l'encontre de sa conception, donc si vous utilisez cette technique, je serais sûr de vérifier si elle continue à fonctionner dans les nouvelles versions Android à mesure qu'elles apparaissent.

(commentaire original suit :)

Si vous regardez le SimpleAdapter description, il dit qu'il est « Un adaptateur facile à la carte données statiques à des vues définies dans un fichier XML. » J'ai ajouté l'accent - mis simplement, SimpleAdapater n'est pas construit pour une utilisation avec des données qui changent; il ne gère que les données statiques. Si vous ne pouvez pas utiliser un ArrayAdapter parce que vos données contiennent plus d'un seul bit de texte, alors vous devrez soit créer votre propre ListAdapter personnalisé, soit placer vos données dans un DB et utiliser l'un des CursorAdapter s.

En dernier recours, si vous n'avez pas besoin de beaucoup de performances, vous pourrait mettre à jour un ListView soutenu par une SimpleAdapter en construisant une nouvelle SimpleAdapter instance tout en tout temps vos modifications de données et de dire la vue de la liste pour l'utiliser via setListAdapter.

+4

Votre réponse ici est vraiment trompeuse. Après la mise à jour des données du tableau et l'appel de notifyDataSetChanged() sur mon SimpleAdapter, j'ai pu mettre à jour le simpleAdapter. Inutile d'utiliser ArrayAdapter pour appeler notifyDataSetChanged(). – dell116

+1

@ dell116 Assez juste. J'ai fait allusion à cette possibilité à la fin de ma réponse, mais je l'ai promu au sommet en fonction de vos commentaires, à savoir que cela fonctionne effectivement; Je ne l'avais pas testé. Je maintiens toujours que faire une telle chose mérite une certaine prudence puisque la documentation SimpleAdapter indique spécifiquement qu'il s'agit de données statiques. –

+0

En revenant à ce maintenant ... wow. Je ne savais rien sur la programmation ou l'objectif de SimpleAdapter. Si vous utilisez un ListView (ou un AdapterView) soutenu par une structure de données qui changera, n'utilisez pas SimpleAdapter. Foot.inMouth (true); – dell116

2

SimpleAdapter est destiné aux données statiques, donc vos performances peuvent varier. La meilleure solution est probablement de passer à un autre type d'adaptateur, tel que ArrayAdapter, ou de créer un nouveau SimpleAdapter chaque fois que vous modifiez l'ensemble de données.

3
ListView lv= (ListView) findViewById(R.id.loglist); 
ArrayList<Map<String, String>> list = buildData(); 
String[] from = { "time", "message" }; 
int[] to = { R.id.logtime, R.id.logmessage }; 

adapter = new SimpleAdapter(getApplicationContext(), list,R.layout.log_list_row, from,to); 
lv.setAdapter(adapter); 

Appelez cette fonction à chaque fois pour mettre à jour ListView. Gardez à l'esprit que vous devez mettre à jour la liste des variables avec de nouvelles données ..

Hope this helps .. :)

0

Je n'ai pas pu obtenir notifyDataSetChanged() pour travailler sur la mise à jour de mon SimpleAdapter, donc au lieu que j'ai essayé d'abord enlever toutes les vues qui ont été attachés à la mise en page de parent à l'aide removeAllViews(), puis en ajoutant le ListView, et qui a travaillé, me permettant de mettre à jour l'interface utilisateur:

LinearLayout results = (LinearLayout)findViewById(R.id.results); 
ListView lv = new ListView(this); 
ArrayList<HashMap<String,String>> list = new ArrayList<HashMap<String,String>>(); 
SimpleAdapter adapter = new SimpleAdapter(this, list, R.layout.directory_row, 
        new String[] { "name", "dept" }, new int[] { R.id.name, R.id.dept }); 

for (...) { 
    HashMap<String, String> map = new HashMap<String, String>(); 
    map.put("name", name); 
    map.put("dept", dept); 
    list.add(map); 
} 

lv.setAdapter(adapter); 
results.removeAllViews();  
results.addView(lv); 
-2
mySimpleAdapter.notifyDataSetChanged(); 

Utilisez cette ligne après la mise à jour données dans les données HashMap list

+0

s'il vous plaît lire la documentation, pas possible sur SimpleAdapter comme indiqué ci-dessus SimpleAdapter pas destiné à de telles actions. – Manny265

Questions connexes