2010-07-22 4 views
8

È possibile aggiornare un SimpleAdapter? Ho un elenco di dati e un piè di pagina che dice "Vedi i risultati successivi". Quando si fa clic su quell'elemento dell'elenco, acquisisco l'evento e ottengo nuovi dati. Quindi voglio sostituire i dati nel ListView con questi nuovi dati, ma non riesco a capire come farlo. Qualche idea? Non voglio usare un ArrayAdapter, perché per quanto posso vedere gli oggetti possono contenere solo una stringa dove ne ho bisogno per contenere più stringhe e stringhe.Come aggiornare SimpleAdapter in Android

risposta

10

Aggiornamento: Secondo del116, si può infatti dare SimpleAdapter una mappa mutevole e quindi chiamare manualmente il metodo della scheda notifyDataSetChanged quando è necessario l'elenco da aggiornare. Tuttavia, il mio punto qui sotto si riferisce alla documentazione di SimpleAdapter che specifica che è per i dati statici; utilizzarlo per dati mutabili è in contrasto con il suo design, quindi se si utilizza questa tecnica sarei sicuro di verificare se continua a funzionare in nuove versioni Android come emergono.

(commento originale segue :)

Se si guarda al SimpleAdapter description si dice che è "un adattatore facile per mappare dati statici alle viste definite in un file XML." Ho aggiunto l'enfasi: semplicemente, SimpleAdapater non è stato creato per l'uso con i dati che cambiano; gestisce soltanto i dati statici. Se non è possibile utilizzare uno ArrayAdapter poiché i dati contengono più di un singolo bit di testo, sarà necessario creare il proprio numero personalizzato ListAdapter oppure inserire i dati in un DB e utilizzare uno dei valori CursorAdapter s.

Come ultima risorsa, se non avete bisogno di molto le prestazioni, si potrebbe aggiornare un ListView sostenuta da un SimpleAdapter con la costruzione di una nuova istanza SimpleAdapter qualsiasi momento le modifiche dei dati e dire la visualizzazione elenco per usarlo tramite setListAdapter.

+4

La tua risposta qui è davvero fuorviante. Dopo aver aggiornato i dati dell'array e aver chiamato notifyDataSetChanged() sul mio SimpleAdapter, sono stato in grado di aggiornare il SimpleAdapter. Non è necessario utilizzare ArrayAdapter per chiamare notifyDataSetChanged(). – dell116

+1

@ dell116 Abbastanza giusto. Mi sono riferito a questa possibilità alla fine della mia risposta, ma l'ho promosso in cima basandomi sul tuo feedback che effettivamente funziona; Non l'avevo provato Continuo a sostenere che fare una cosa del genere merita un po 'di attenzione dato che la documentazione di SimpleAdapter specifica specificamente che è per i dati statici. –

+0

Guardando indietro a questo ora ... wow. Non sapevo nulla sulla programmazione o lo scopo previsto di SimpleAdapter. Se stai utilizzando un ListView (o qualsiasi AdapterView) supportato da una struttura dati che cambierà non utilizzare SimpleAdapter. Foot.inMouth (true); – dell116

2

SimpleAdapter è inteso per dati statici, pertanto le prestazioni potrebbero variare. La soluzione migliore è probabilmente passare a un diverso tipo di adattatore, ad esempio ArrayAdapter o creare un nuovo SimpleAdapter ogni volta che si modifica il set di dati.

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); 

Chiamare questa funzione ogni volta per aggiornare ListView. Tenete a mente che è necessario aggiornare l'elenco variabili con i nuovi dati ..

Spero che questo aiuti .. :)

0

non ero in grado di ottenere notifyDataSetChanged() per lavorare su aggiornare il mio SimpleAdapter, così invece ho provato prima di rimuovere tutte le viste che sono stati collegati al layout genitore utilizzando removeAllViews(), quindi aggiungendo il ListView, e che ha funzionato, che mi permette di aggiornare l'interfaccia utente:

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(); 

utilizzare questa linea dopo l'aggiornamento dati nei dati HashMap list

+0

si prega di leggere la documentazione, non possibile su SimpleAdapter come sopra indicato SimpleAdapter non inteso per tali azioni. – Manny265