Android: aggiornamento di simpleCursorAdapter
-
28-10-2019 - |
Domanda
Ho un ListActivity
che ottiene i suoi dati da una query sul database. Ho anche un adattatore personalizzato che estende l'adattatore del cursore semplice.
Per mostrare il contenuto personalizzato, ho sovrascritto i metodi newView
e bindView.
Ogni elemento della vista ha:
-
TextView
contenente un titolo -
ImageView
contenente il numero di stelle - l'immagine mostrata viene modificata in base a un valore ottenuto dal database - Un pulsante: il testo del pulsante cambia ai clic (Preferito / Crea preferito) e attiva un evento di aggiornamento del database.
Il mio problema è questo: quando scorro il ListView
, le modifiche che ho apportato sembrano scomparire .. ad esempio, il primo elemento è contrassegnato come preferito e l'elenco viene fatto scorrere ... quando torno al primo elemento, il testo ritorna al suo valore precedente, sebbene internamente il db sia stato aggiornato.
Ho letto che notifyDatasetChanged()
non è corretto in questo caso poiché l'adattatore dovrebbe essere informato delle modifiche al database. Sto cercando di utilizzare il metodo reQuery()
, ma non so dove posizionarlo.
Devo inserire reQuery()
nel metodo onClick
del pulsante? In caso contrario, dove dovrebbe essere posizionato?
Soluzione
Qualunque sia l'adattatore che stai usando deve avere il metodo getView. Ogni volta che viene fatto scorrere un elenco, questo metodo getView viene chiamato per tutti gli elementi listItem nella vista.Assicurati nel metodo getView.Che la visualizzazione viene generata in modo dinamico.
Dovrebbe controllare il valore cliccato o modificato.
per aggiornare l'elenco senza scorrere devi chiamare listView.getAdapter (). notifyDataSetChanged ()
Controlla il seguente link.qui ho citato un codice completo per utilizzare correttamente listview.Usando questo possiamo ottenere qualsiasi comportamento listview.Possiamo anche incorporare l'animazione.
Modifica lo sfondo di ListView - comportamento strano
Spero che questo aiuto :)
Altri suggerimenti
Se hai BaseAdapter esteso, dopo che i dati sono stati modificati chiama, listView.setAdapter () e in getView (), aggiorna anche i dati della vista.
Utilizza SetListAdapter
con ArrayAdapter
per visualizzare l'elenco.Utilizza ConvertView
per evitare di gonfiare View
.
if (convertView==null)
{
//inflate your list
}