2010-04-04 4 views
5

Sto avendo il seguente problema:Casella 'Controllato' in ListView viene ripristinata dopo lo scorrimento

Ho un ListActivity, la sua ListView è composto da un'icona, testo e una casella di controllo (usando LayoutInflater).

L'adattatore per il ListView estende ResourceCursorAdapter (vale a dire l'origine dati del ListView viene recuperato da un database, anche lo stato Controllato di ogni riga)

Tutto funziona piuttosto male, tranne quando ho/deselezionare selezionare la casella di controllo in qualsiasi riga, se si scorre verso il basso fino a quando la casella di controllo modificata non è più visibile, quindi si scorre verso l'alto, la casella di controllo viene ripristinata allo stato originale.

Il database è stato modificato, questo non è il problema (ad esempio se modifico una riga ed esco dall'attività, e inserisco di nuovo, la riga modificata viene visualizzata Ok).

La mia ipotesi è che questo abbia qualcosa da fare su come viene reso l'elenco perché per qualche motivo ListView "rende" lo stato originale di tutte le righe quando è stato popolato per la prima volta durante lo scorrimento.

Ho cercato questo errore ma non trovo nessuno con questo problema. Apprezzo qualsiasi consiglio che hai.

risposta

1

Il problema è stato risolto chiudendo il cursore corrispondente dopo aver modificato il database e riaperlo con changeCursor().

+0

puoi dirmi dove scrivere questa riapertura del codice del cursore? intendo in bindview o newview o da qualche altra parte? – Hunt

1

Quando l'elemento viene visualizzato, verrà richiamato il metodo ListAdapter.getView().

Questo potrebbe accadere più volte per sessione, se ad esempio si scorre l'elemento dallo schermo e poi di nuovo.

Suggerirei di inserire un punto di interruzione su getView() ed eseguire l'app con il debugger. Ripeti il ​​test e, occasionalmente, viene richiamato getView() per la seconda volta, controlla la logica in cui è impostata la casella di controllo.

Un'altra considerazione è che il secondo parametro di getView è una vista 'convertView'. Questa è una delle tue viste da altre voci della lista che non sono più visibili. Il sistema operativo restituisce questa visualizzazione all'utente in modo da avere l'opzione di "riciclare" la vista per creare la nuova voce, anziché gonfiarne una nuova che avrà un impatto sulle prestazioni.

Se si ignora questo parametro, non sarà un problema (anche se per fare un elenco scorrevole si può considerare di utilizzarlo in futuro - basta ricordare di controllare che la Vista sia del tipo che ci si aspetta impostando il Etichetta).

Se si sceglie di utilizzare questo parametro per tentare il riciclo di una vista, controllare la logica e assicurarsi di aver impostato tutti i controlli sullo stato desiderato poiché lo stato di default del layout potrebbe non essere applicabile.

+0

Grazie per la risposta. Come ho capito, per un CursorAdapter dovrei modificare il contenuto della vista nel metodo bindView. Non sono sicuro che in questo caso venga utilizzato getView. O in ogni caso, quando bindView sarà chiamato e quando getView? In questo momento non sto usando affatto getView, solo newView e bindView. Ho studiato un po 'su getView e l'uso di convertView per riciclare la vista, ma sono ancora confuso da quando verrà chiamato bindView (getView e bindView avranno lo stesso codice?) Inoltre, bindView non passa il convertView ma solo una vista. – adrianrdzv

2

Questo collegamento fornisce una panoramica il problema

EditText items in a scrolling list lose their changes when scrolled off the screen

Elenco file vengono riciclati. Il Cursore potrebbe contenere 1.000 record, ma ci sono non saranno convertiti in widget EditText se si scorre l'elenco tramite . Piuttosto, ci saranno 10 o quindi, a seconda di quante righe sono visibili contemporaneamente .Righe vengono riciclati, e l'operazione di legatura sostituirà il vecchio valore EditText con un nuovo valore dal cursore per qualsiasi riga appena scorrere sullo schermo , sostituendo qualsiasi c'era prima (valore precedente dal database o un valore modificato dall'utente).