2010-09-28 8 views
8

Quando si esegue l'override del baseadapter su un listview di Android, è necessario implementare questo metodo public View getView(int position, View convertView, ViewGroup parent). La conversione è la vista che è stata precedentemente rimossa dall'elenco durante lo scorrimento e viene fornita in modo da poter riutilizzare quella vista invece di creare una nuova vista.Riciclare le visualizzazioni in una lista, ne vale la pena?

La mia domanda è, è davvero necessario riutilizzare la vista? Posso capire di riutilizzarlo se viene modificato solo un pezzo di dati. Ma l'overhead di creare una vista davvero così significativa? Ogni tutorial sull'uso di listview che ho visto ti dice di riciclare la vista, anche su viste banalmente semplici come una visualizzazione di testo.

Suppongo che la mia domanda sia: perché google ha deciso di rendere questo il comportamento predefinito del metodo getView?

+1

Questo non è difficile da fare e il framework lo rende semplice .. Quindi sì, ne vale la pena. – Rorist

risposta

13

Un paio di motivi per riciclare vista:

  • creazione oggetto è relativamente costoso. Ogni oggetto aggiuntivo che viene creato deve essere gestito dal sistema di garbage collection e almeno temporaneamente aumenta il footprint di memoria
  • Questo è più importante per le viste più complesse, ma gonfiare e disporre gli oggetti di visualizzazione può essere costoso. Molto spesso, si effettuano solo piccole modifiche alla vista in getView che non influiscono sul layout (ad esempio, l'impostazione del testo) in modo da evitare il sovraccarico del layout.
  • Ricorda che Android è progettato per essere eseguito in un ambiente con risorse limitate.
  • Infine, è già stato fatto per te e non fa male a nulla, quindi perché non usarlo?
+0

almeno un motivo per non farlo è se si desidera avere layout diversi per righe diverse in listview. se in effetti usi layout diversi, non puoi riciclare la vista del concerto. per essere in grado di riciclare, è necessario combinare le varie visualizzazioni di riga possibili in una vista uber. è più costoso che non riciclare viste più piccole? Non lo so. –

+8

@JeffreyBlattman sbagliato. BaseAdapter supporta diversi elementi di visualizzazione elenco con getItemViewType (int position) e getViewTypeCount(). ListView gestirà il corretto riciclaggio per te dopo aver fornito la vista corretta in getView(). –

+3

grazie per avermi corretto. –

7

È necessario? Solo se ti piace un extra di 30-40 fps durante le avventure su un Nexus One. :) (Vedi le diapositive da http://code.google.com/events/io/2010/sessions/world-of-listview-android.html, diapositive 13-17)

Perché fare funzionare il dispositivo che non ha bisogno di fare ignorando una ottimizzazione significativa che è stata fatta al 95% per te?

+0

Immagino che fosse la mia domanda. Che cosa è esattamente il sovraccarico che riusare una vista fornisce – Falmarri

+1

Inflazionare da XML è una parte enorme di esso. L'abbandono degli oggetti è meno significativo, ma può portare a notevoli pause del GC durante i lanci, specialmente sui dispositivi più vecchi. – adamp

Problemi correlati