2012-09-11 10 views
13

Czy dla wydajności ważne jest, aby funkcja ViewHolder była statyczna w urządzeniu ViewHolder pattern?Czy dla wydajności parametr ViewHolder ma być statyczny we wzorcu ViewHolder?

ViewHolder przechowuje obiekt każdy z komponentów poglądów wewnątrz pola Układ tag , więc można od razu uzyskać do nich dostęp bez konieczności aby wyszukać je wielokrotnie. Najpierw musisz utworzyć klasę, aby zachować dokładny zestaw widoków. Na przykład:

static class ViewHolder { 
    TextView text; 
    TextView timestamp; 
    ImageView icon; 
    ProgressBar progress; 
    int position; 
} 

Odpowiedz

8

To nie jest kluczowa dla wydajności, to jest o użyciu. Jeśli ViewHolder klasa nie będzie statyczna - trzeba zapewnić instancję klasy nadrzędnej:

No enclosing instance of type Type is accessible. 
Must qualify the allocation with an enclosing instance of type Type 
(e.g. x.new A() where x is an instance of Type). 
+10

Co zrobić, jeśli klasa ViewHolder jest używana wewnątrz samej klasy adaptera? Wtedy nie musisz podawać instancji klasy rodzica ... –

+4

Tak, nie. – Jin35

+0

Ale to może spowodować wyciek adaptera, jak wskazano w http://stackoverflow.com/questions/10864853/when-exactly-is-it-leak-safe-to-use-anonymous-inner-classes – divyenduz

1

Edit: niezrozumiany pytanie - wydaje się pytasz konkretnie o co static. To nie powinno mieć kluczowego znaczenia dla wydajności, ale pomysł pomaga.

Ostateczna edycja tutaj: Static nested class in Java, why?

====

oryg odpowiedź poniżej:

To bardzo miło ścisnąć wydajność z ciężkiego ListView (lub jakiś inny rodzaj recyklingu AdapterView). Najlepszym sposobem opowiedzenia byłoby jednak jakoś profilować występ.

Również w Google IO 2010 zalecają tę metodę:

http://www.youtube.com/watch?v=wDBM6wVEO70

Edit:

Również tutaj jest link do traceview do profilowania wydajności, choć jestem pewien, jak dobrze Prace.

http://developer.android.com/tools/debugging/debugging-tracing.html

-2

nie jest to obowiązkowe, aby to zrobić. Ale jeśli użyjesz tego w ten sposób, ponownie użyjesz widoków, gdy widok adaptera będzie pusty. Tworzysz widok i przypisujesz wartości do części widoku i otagujesz cały widok za pomocą klasy statycznej ViewHolder. Więc kiedy wrócisz, a widok nie będzie pusty, pojawi się widoczna część, aby uzyskać znacznik. W ten sposób będziesz tworzyć mniej obiektów, a także mniej pracy na adapterze.

Powiązane problemy