Risposte:
Gestiscono il caso in cui desideri tipi diversi di visualizzazione per righe diverse. Ad esempio, in un'applicazione di contatti potresti volere che anche le righe abbiano le immagini sul lato sinistro e le righe dispari abbiano le immagini sul lato destro. In tal caso, useresti:
@Override
public int getViewTypeCount() {
return 2;
}
@Override
public int getItemViewType(int position) {
return position % 2;
}
Il framework utilizza il tipo di visualizzazione per decidere quali visualizzazioni passare convertViewnel getViewmetodo . In altre parole, nell'esempio sopra, le tue righe pari otterranno solo viste riciclate con le immagini sul lato sinistro da riutilizzare e le righe dispari otterranno solo quelle con le immagini sulla destra.
Se ogni riga del tuo elenco ha lo stesso layout, non devi preoccuparti dei tipi di visualizzazione. In effetti, BaseAdapter.java fornisce un comportamento predefinito per tutti gli adattatori:
public int getItemViewType(int position) {
return 0;
}
public int getViewTypeCount() {
return 1;
}
Questo in effetti ti fornisce lo stesso tipo di vista per ogni riga.
Modifica - per delineare il flusso generale:
AdapterViewutilizzando un adattatore.AdapterViewtentativo di visualizzare gli elementi che sono visibili all'utente.getItemViewTyperiga n, la riga che sta per visualizzare.ntipo di riga . Non ne trova perché nessuna vista è stata ancora riciclata.getViewviene chiamato per la riga n.getItemViewTypeper la riga nper determinare quale tipo di vista dovresti usare.getViewe la vista della tua riga viene visualizzata per l'utente.Ora, quando una vista viene riciclata scorrendo fuori dallo schermo, passa in un pool di viste riciclate gestito dal framework. Questi sono essenzialmente organizzati in base al tipo di vista in modo che una vista del tipo corretto sia fornita nel convertViewparametro nel getViewmetodo:
getItemViewTypela riga che desidera visualizzare.convertViewparametro al getViewmetodo.Se abbiamo bisogno di mostrare diversi tipi di vista nella vista elenco, allora è buono da usare getViewTypeCount()e getItemViewType()nell'adattatore invece di alternare una vista View.GONEe View.VISIBLEpuò essere un'attività molto costosa all'interno della getView()quale influenzerà lo scorrimento dell'elenco.
Controllare questo per l'uso di getViewTypeCount()e getItemViewType()nell'adattatore.
Guarda Outttt !!!!
Ho dovuto affrontare un problema nell'implementazione di ListViewieri ed è due tipi di visualizzazioni per le righe che si sono confuse subito dopo averlo fatto scorrere. Anche se la risposta più votata all'interno di questo thread fornisce una buona spiegazione generale, non ha messo in evidenza le informazioni più importanti per fermare il precedente bug dell'interfaccia utente che ho citato.
Ecco la mia spiegazione:
entrambi getViewTypeCount()egetItemViewType() sono utilizzati da BaseAdapter's getViewmetodo per scoprire quale tipo di vista dovrebbe essere recuperare, riciclati e restituiti. (come spiegato nella risposta in alto all'interno della discussione). Ma se non si implementano questi due metodi in modo intuitivo in base al documento API di Android, è possibile che si verifichi il problema di cui ho parlato.
Sintetica Direttiva per l'attuazione:
Per implementare diversi tipi di Viewsper ListView's righe dobbiamo attuare essenzialmente, getItemViewType()egetViewTypeCount() metodi. E la getItemViewType()documentazione ci fornisce una nota come segue:
Nota: I numeri interi deve essere nel range
0digetViewTypeCount() - 1.IGNORE_ITEM_VIEW_TYPEpuò anche essere restituito.
Quindi, nel tuo getItemViewType()caso dovresti restituire i valori per Tipo di vista, a partire da 0, fino all'ultimo tipo come (numero di tipi - 1). Ad esempio, supponiamo che tu abbia solo tre tipi di visualizzazioni? Pertanto, a seconda dell'oggetto dati per la vista, è possibile restituire solo 0 o 1 o 2 dal getItemViewType()metodo, come un indice di array basato su zero. E poiché hai utilizzato tre tipi di visualizzazioni, il tuo getViewTypeCount()metodo deve restituire 3.
In ogni caso, se restituisci altri valori interi come 1, 2, 3 o 111, 222, 333 per questo metodo, potresti sicuramente riscontrare il bug dell'interfaccia utente sopra indicato che hai appena inserito non obbedendo al documento API Android.
Se non hai avuto la minima idea o non hai ancora potuto risolvere e hai bisogno di ulteriori informazioni, leggi il mio risposta dettagliata all'interno di questo thread di domande e risposte StackOverflow .
Leggi il Documento per sviluppatori Android per per ulteriori informazioni che potresti trovare direttamente l'indizio.
Spero che questa risposta possa essere utile a qualcuno là fuori per risparmiare un sacco di ore !!!
Saluti!!!
IGNORE_ITEM_VIEW_TYPEche avevo un bug su uno dei miei ListView. Ho usato un ArrayAdapter per inserire una vista composta da 1 immagine e 2 vista di testo. Ho avuto solo un tipo di vista. Ho provato a non sostituire il metodo getItemViewType o a sostituirlo restituendo la posizione o un numero intero hardcoded. In tutti i casi, ho riscontrato duplicati nell'elenco, con comportamenti strani durante lo scorrimento (modifiche ai duplicati). Il ritorno IGNORE_ITEM_VIEW_TYPEnel metodo ha risolto il problema. Grazie.