Come Romain Guy explained a while back durante la Google I/O session, il modo più efficiente per aggiornare solo una vista in una vista elenco è qualcosa di simile alla seguente (questo uno aggiornare l'intero dati della vista):
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 che target
sia un elemento dell'adattatore.
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.
Grazie. Questo funzionerebbe se sto ** modificando ** il layout corrente del bambino. Ma cosa succede se voglio ** cambiare il layout del tutto ** (gonfiando un diverso xml)? Se chiamo 'newView (...)' sull'adattatore, mi dà una vista diversa che tuttavia non è inserita in 'listView'. – hadi
@hadi dovresti dare un'occhiata a questa risposta: http://stackoverflow.com/a/11568271/858626 –