Romain Guy explained a while back podczas Google I/O session, najbardziej skuteczny sposób, aby aktualizować tylko jeden widok w widoku listy jest coś takiego jak poniżej (ten zaktualizować całe dane view):
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;
}
Zakładając, że target
jest jedną z pozycji adaptera.
Ten kod pobrać ListView
, a następnie przeglądać aktualnie pokazane widoki, porównanie target
przedmiot szukasz ze sobą wyświetlane Zerknij jeszcze na pozycje, a jeśli cel jest wśród tych, uzyskać widok otaczającej i wykonać zasilacz getView
na tym widok, aby odświeżyć wyświetlacz.
marginesie invalidate
nie działa jak niektórzy ludzie oczekują i nie będzie odświeżać widok jak getView nie, notifyDataSetChanged
będzie odbudować całą listę i kończy się wywołaniem getview
dla każdego wyświetlanych pozycji i invalidateViews
wpłynie także grono.
Jedną z ostatnich rzeczy jest to, że można uzyskać dodatkową wydajność, jeśli wystarczy zmienić widok dziecka z rzędu, a nie cały wiersz, taki jak getView
. W takim przypadku, następujący kod może zastąpić list.getAdapter().getView(i, view, list);
(przykład zmienić TextView
tekst):
((TextView)view.findViewById(R.id.myid)).setText("some new text");
w kodzie ufamy.
Dzięki. To działałoby, gdybym ** edytował ** obecny układ dziecka. Ale co jeśli chcę ** całkowicie zmienić układ ** (nadmuchując inny xml)? Jeśli wywołasz 'newView (...)' na adapterze, daje mi to inny widok, który jednak nie jest umieszczony w 'listView'. – hadi
@hadi powinieneś spojrzeć na tę odpowiedź: http://stackoverflow.com/a/11568271/858626 –