7

Ecco lo scenario: ho una semplice ListView che mostra un feed di Twitter. Ho un CursorAdapter che sta recuperando tweet da sqlite. Quando chiamo requery() sul mio cursore, mi aspetto che vengano caricati nuovi tweet che sono stati aggiunti al database. Funziona tutto bene e i nuovi elementi sono visibili anche in ListView dopo che questo è successo.Android ListView con CursorAdapter ha una scorretta posizione di scorrimento dopo che la richiesta viene chiamata quando vengono aggiunti nuovi articoli

Il problema è che la posizione di scorrimento sembra essere salvata in base all'offset di posizione dell'elemento. Quindi diciamo che la prima posizione visibile nel mio ListView è 4. Quando eseguo la query e 2 nuovi elementi vengono aggiunti in cima all'elenco, il ListView mantiene la posizione di scorrimento del primo oggetto visibile come 4, tuttavia dal momento che ci sono due nuovi elementi nell'elenco , Ora vedo un oggetto diverso in posizione 4 rispetto a prima che mi aggiornassi. Questa immagine illustra il prima e il dopo: enter image description here

Notate come Prima, Tweet D è il primo elemento visibile e poi, Tweet B ora diventa il primo elemento visibile.

La mia domanda è, come posso mantenere la stessa posizione di scorrimento in base alla posizione del cursore quando si chiama la richiesta, in modo che in questo esempio, Tweet D sarebbe ancora il primo elemento visibile dopo una richiesta?

risposta

0

Il mio suggerimento sarebbe quello di tenere traccia del numero di elementi nell'elenco. Una volta che lo sai, come parte dell'aggiornamento puoi aggiungere la differenza tra il vecchio conteggio e il nuovo conteggio.

Psuedo Codice

on_update

offset+= (list_view.length() - list_size) 
    list_size = list_view.length() 
3

Ho avuto un problema simile in uno dei miei progetti. Ecco come l'ho risolto. Anche se non è esattamente lo stesso caso. Spero che sia d'aiuto.

Prima di aggiornare la lista, salva la posizione di scorrimento in questo modo -

int position = getListView().getFirstVisiblePosition(); 
View v = getListView().getChildAt(0); 
int top = v == null ? 0 : v.getTop(); 

E poi, dopo aver aggiornato l'elenco, si sa quanti articoli hai aggiunto. Quindi puoi chiamare

yourlistview.setSelectionFromTop(position + <number of items added>, top); 
+0

Il mio problema principale con questo è che tutti i miei articoli non hanno la stessa altezza, quindi lo scorrimento come questo potrebbe non ottenere la posizione 'esatta' che era in precedenza, ad esempio se un oggetto è metà visibile ... – Redth

+0

Hai provato? Perché anche la mia lista ha file di altezze variabili. Ma funziona perfettamente. 'int top = v == null? 0: v.getTop(); 'Questa parte gestisce effettivamente il caso quando un elemento è parzialmente visibile. – Enigma

Problemi correlati