2015-03-05 23 views
5

Mam Adapter z wieloma typami widoków. Zauważyłem, że onCreateViewHolder() jest wywoływana dość często, mimo że onCreateViewHolder(), onBindViewHolder() i getItemViewType() są zaimplementowane poprawnie.RecyclerView reusing algorithm

Na przykład moja RecyclerView powinien wyświetlić prostą listę różnych przedmiotów, takich jak ten i pozwala zakładać, że wszystkie elementy mają taką samą wysokość widzenia i że 6 elementów wypełnić cały ekran (dopasowuje wysokość RecyclerView):

> ViewType0 
> ViewType0 
> ViewType0 
> ViewType0 
> ViewType0 
> ViewType1 
> ViewType2 
> ViewType2 
> ViewType2 
> ViewType2 
> ViewType1  
> ViewType1 
> ViewType1 
> ViewType0 
> ViewType0 
> ViewType0 

Podczas przewijania i dojścia do końca listy wydaje się, że dla dwóch ostatnich pozycji (ViewType0) RecyclerView wywołuje onCreateViewHolder(), ale z mojego punktu widzenia widok recyklingu powinien zawrócić (ponownie użyć) już istniejącego (na wierzchu jest 5) lista, która nie jest widoczna) zamiast ponownego tworzenia dwóch nowych dla dwóch ostatnich elementów.

Czy to normalne zachowanie? Czy ustawienia, które mogę zastosować, pozwalają uniknąć odtworzenia nowego obiektu ViewHolder, ponieważ powinny być na pewno wielokrotnego użytku ViewHolders (od początku listy)?

+0

Dobra uwaga. Też to zauważyłem. –

Odpowiedz

0

To zupełnie normalne. Wytłumaczę pokrótce, jak to działa.

Gdy tylko widok zostanie przewinięty poza okno, RecyclerView ma dwie opcje: do recyklingu lub do ponownego użycia tego widoku. Określa, którą opcję wybrać, po prostu porównuje viewType następnego elementu, który pojawia się obok z przewijanym widokiem; jeśli są takie same, po prostu ponownie użyj widoku i odwrotnie.

W twoim przypadku, te 5 widoków ViewType0 z pewnością zostanie poddanych recyklingowi na długo przed pojawieniem się dwóch ostatnich widoków ViewType0, więc jedynym sposobem wyświetlenia tego widoku jest jego odtworzenie.