Come Romain Guy explained a while schiena durante la Google I/O session, il modo più efficiente per aggiornare solo una vista in una vista lista è qualcosa di simile alla seguente (questo aggiornare l'intera View
dati):
ListView list = getListView();
int start = list.getFirstVisiblePosition();
for(int i=start, j=list.getLastVisiblePosition();i<=j;i++)
if(target==list.getItemAtPosition(i)){
View view = list.getChildAt(i-start);
list.getAdapter().getView(i, view, list);
break;
}
Supponendo target
è un elemento della scheda.
Questo codice recuperare la ListView
, quindi visualizza le viste attualmente indicati, confrontare la voce target
siete alla ricerca di uno con l'visualizzate le voci vista, e se il vostro obiettivo è tra quelli, ottenere la vista che racchiude ed eseguire l'adattatore getView()
su quel visualizza per aggiornare il display.
Come nota a margine invalidate()
non funziona come alcune persone si aspettano e non saranno aggiornare la vista come getView()
fa, notifyDataSetChanged()
sarà ricostruire l'intera lista e finiscono per chiamare getview()
ogni elementi visualizzati e invalidateViews()
influirà anche un mazzo.
Un'ultima cosa, si può anche ottenere prestazioni extra se ha solo bisogno di cambiare una vista figlio di una riga e non l'intera riga come getView
.In tal caso, il seguente codice può sostituire list.getAdapter().getView(i, view, list);
(esempio per cambiare un testo TextView
):
((TextView)view.findViewById(R.id.myid)).setText("some new text");
Nel codice ci fidiamo.
"C'è un modo per farlo ridisegnare quella riga senza chiamare listview.notifydatasetchanged()?" - basta trovarlo come figlio del 'ViewGroup' (in questo caso,' ListView') e modificarlo. "Ho provato a chiamare view.invalidate() sulla vista (all'interno del linearlayout) ma non ridisegna la riga." - sei sicuro di avere la fila giusta? Non dovresti nemmeno aver bisogno di chiamare 'invalidate()', AFAIK. – CommonsWare
Ho sicuramente la fila giusta e la vista giusta. Penso che il mio problema è che il mio ascoltatore di preferenze è quello di raccogliere i rifiuti. L'ho cambiato, così chiamo notifyDataSetChanged() nella mia attività suResume(), che risolve il problema che stavo cercando di risolvere. – Falmarri