Sviluppatore Android abbastanza nuovo qui.getView chiamato con posizione errata durante lo scorrimento veloce
Mi sono imbattuto in uno strano problema che non so come risolvere. Ho letto molti problemi qui intorno che sembrano lo stesso problema che ho, ma le soluzioni ai loro problemi non sembravano mai applicabili a ciò che sta accadendo qui.
Ho un listView personalizzato impostato utilizzando una classe separata che estende BaseAdapter e utilizza un titolare della vista (ho impostato questo aspetto guardando vari diversi esempi di visualizzazioni di elenco personalizzate). Ha una visualizzazione testuale, un pulsante, una barra di avanzamento e un pulsante immagine, e questi elementi sono nascosti/modificati in base a un AsyncTask utilizzato per scaricare un file.
Tutto funziona correttamente quando faccio scorrere l'elenco lentamente. Quando faccio scorrere rapidamente l'elenco su/giù, è come se le viste di alcune celle nell'elenco venissero riassegnate ad altre celle.
ho messo questa linea nella parte superiore del mio metodo "GetView" nella mia classe di adattatori:
@Override
public View getView(final int pos, View convertView, ViewGroup parent)
{
Log.i("ks3","getView called, position is " + pos);
ho 7 elementi nella mia lista, e 6 di loro stanno sullo schermo. Quando prima viene visualizzata, vedo questo nel mio ceppo:
getView called, position is 0
getView called, position is 1
getView called, position is 2
getView called, position is 3
getView called, position is 4
getView called, position is 5
Quando ho scorrere verso il basso lentamente alla voce successiva, questo viene stampato prossimo:
getView called, position is 6
Quando ho scorrere indietro in su, questo :
Il basso e il basso producono questi risultati in modo impeccabile.
Quando comincio lo scorrimento avanti e indietro velocemente, esso stampa questo messaggio un mucchio di volte, che mostra la maggior parte 6 e 0 come la posizione, ma di tanto in tanto mi vedrà questi così:
getView called, position is 1
getView called, position is 5
posizioni 1 e 5 non dovrebbero essere chiamati, dato che sono sempre sullo schermo. È come se getView si fosse fatto tutto confuso. Allo stesso tempo, come ho detto prima, la mia lista sembrerà strana. I pulsanti immagine verranno spostati verso l'alto o verso il basso in una cella in cui non dovrebbero essere.
Se torno indietro a scorrere senza problemi, vedo solo 0 e 6 per la posizione di nuovo.
Sinceramente non sono sicuro di come aggirare questo problema. Ho pensato che forse potrei limitare la velocità di scorrimento della lista, ma non sono riuscito a trovare nulla che funzioni.
Grazie!
Modifica: Volevo aggiornare un paio di cose riguardo a questa domanda. Il primo è che, da un commento qui e dal video di Google su listView, è venuto alla mia attenzione che getView può essere chiamato per altre cose quindi quello che immaginavo fosse, come le misurazioni, e quindi non dovrei essere allarmato da quello che pensavo originariamente faceva parte del mio problema (essendo che pensavo che getView venisse chiamato con le posizioni sbagliate).
In secondo luogo, ho visto più volte che è una pessima idea "memorizzare le viste nell'adattatore". Non sono esattamente chiaro su cosa significhi, ma sono abbastanza sicuro che sia una delle cose che sto facendo male (ho salvato un'istanza di un pulsante, progressBar, imageButton ...).
Questo, insieme al fatto che aggiorno le viste al di fuori di getView e non uso notifyDataSetChanged(); quelli insieme stanno probabilmente facendo succedere cose strabilianti.
A meno che il tuo ListView personalizzato non stia facendo qualcosa di funky, sembra un problema di riciclaggio, inserisci il tuo codice getView() completo. – dmon
Se non si riscontrano errori nel codice e si utilizza Honeycomb o versione successiva, è possibile provare a disabilitare l'accelerazione hardware per il layout dell'elenco. L'accelerazione hardware può potenzialmente causare tali errori. – zapl
Sembra un problema di riciclaggio. Ho intenzione di dare un'occhiata al video di Google su listViews e vedere se ci sono problemi evidenti con come sto usando listView. – Droidmon