C'è una domanda semplice che dopo la ricerca ho voluto chiedere perché abbiamo creato una classe di supporto statico e assegnato le viste al suo interno? Per favore, chiarisci i miei dubbi, sarà di grande aiuto per me.Classe di supporto nell'adattatore Classe
risposta
Il codice potrebbe chiamare findViewById()
frequentemente durante lo scorrimento di ListView
, che può rallentare le prestazioni. Anche quando l'adattatore restituisce una visualizzazione gonfiata per il riciclaggio, è comunque necessario cercare gli elementi e aggiornarli. Un modo per aggirare l'uso ripetuto di findViewById()
consiste nell'utilizzare il modello di progettazione "view holder"
.
A ViewHolder
un oggetto memorizza ciascuna delle viste componente all'interno del campo del tag del Layout, in modo da poterle accedere immediatamente senza la necessità di cercarle ripetutamente. Innanzitutto, devi creare una classe per contenere l'esatto gruppo di visualizzazioni.
È possibile leggere Android Guideline per ulteriori dettagli.
- Quindi, quando si utilizza "View Holder", è quindi possibile accedere facilmente a ciascuna vista senza la necessità di effettuare la ricerca, risparmiando così preziosi cicli del processore.
- avere un
static inner class
per la vista migliora notevolmente le prestazioni
è anche possibile vedere Why does Android prefer static classes collegamento.
Un altro link interessante How ListView Work, dopo aver letto questo sviluppatore blog può cancellare la logica di LisView e anche per questo necessario implementare classe statica interna per ListView.
È un punto di ottimizzazione. Senza viewHolder, dovrai chiamare i metodi findViewById ogni volta. con viewHolder, devi solo chiamarli una volta sola.
Esempio con un TextView e un ImageView:
Senza ViewHolder:
if (convertView == null) { convertView = mInflater.inflate(..., null); } //Following called each time TextView tv = (TextView)convertView.findViewById(...); ImageView iv = (ImageView)convertView.findViewById(...); tv.setText(...)
Con ViewHolder:
if (convertView == null) { convertView = mInflater.inflate(..., null); holder = new ViewHolder(); //called once holder.tv = (TextView) vi.findViewById(..); holder.iv = (ImageView) vi.findViewById(...); vi.setTag(holder); } else { holder = (ViewHolder) vi.getTag(); } holder.tv.setText(...)
La risposta è anche semplice se si capire come un AdapterView
funziona.
Un AdapterView
è una vista i cui figli sono determinati da un Adapter
. Lo AdapterView
(in particolare l'implementazione concreta come ListView
) contiene più informazioni di quelle mostrate in un dato momento. Per ottimizzare il consumo di memoria e anche per motivi di prestazioni, lo Adapter
di solito riutilizza i valori View
che rappresentano i singoli elementi. Quindi hai meno numero di oggetti View
rispetto ai dati corrispondenti.
Gli oggetti riusati possono essere una gerarchia complessa di View
se ViewGroups
. Quindi, nel caso in cui si desideri trovare i singoli oggetti View
all'interno di questa gerarchia, è necessario dipendere dal metodo findViewById()
e questo diventa costoso quando la gerarchia della vista ha più livelli. Quindi, per semplicità (e anche per migliorare le prestazioni), viene utilizzato il modello View-Holder, in cui i singoli oggetti View
a cui siamo interessati sono assegnati a una classe interna statica.
È possibile fare riferimento a Android ListView and ListActivity - Tutorial di Lars Vogel per ulteriori informazioni sul modello View-Holder.
pls pls help me. – user1537629
La tua domanda riguardante il qualificatore "statico" o ViewHolder in generale? Hai letto la documentazione: http://developer.android.com/training/improving-layouts/smooth-scrolling.html –