2015-03-05 1 views
5

Ho un Adapter con più tipi di visualizzazione. Ho notato che onCreateViewHolder() viene chiamato abbastanza spesso anche se onCreateViewHolder(), onBindViewHolder() e getItemViewType() sono implementati correttamente.Algoritmo di riutilizzo di RecyclerView

Per esempio il mio RecyclerView dovrebbe visualizzare un semplice elenco di elementi diversi come questo e lascia supporre che tutti gli elementi hanno la stessa altezza vista e che 6 elementi riempire l'intero schermo (corrisponde all'altezza della RecyclerView):

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

Mentre si scorre e si raggiunge la fine della lista, sembra che per gli ultimi due articoli (ViewType0) RecyclerView chiami onCreateViewHolder() ma dal mio punto di vista il riciclabile dovrebbe riciclare (riutilizzare) quello già esistente (ce ne sono 5 nella parte superiore di la lista che non è visibile) piuttosto che ricreare due nuovi per gli ultimi due elementi.

Questo comportamento è normale? Sono le impostazioni che posso applicare per evitare la ricreazione del nuovo ViewHolder perché dovrebbero esserci sicuramente ViewHolders riutilizzabili (dall'alto dell'elenco)?

+0

Buon punto. L'ho notato anch'io. –

risposta

0

È completamente normale. Spiegherò brevemente come funziona.

Non appena viene aperta una vista dalla finestra, RecyclerView ha due opzioni: riciclare o riutilizzare tale vista. Determina quale opzione scegliere confrontando semplicemente viewType dell'elemento successivo che appare successivamente con la visualizzazione a scorrimento; se sono uguali, riutilizzare semplicemente la vista e viceversa.

Nel tuo caso, queste 5 viste ViewType0 vengono sicuramente riciclate molto tempo prima che vengano visualizzate le ultime due visualizzazioni ViewType0, quindi l'unico modo per mostrare la vista è di ricrearlo.