2012-06-07 4 views
8

C'è un modo semplice per visualizzare un ListView in ordine inverso? Sto cercando di creare un'app basata sulla conversazione e vorrei che le voci più recenti si trovassero nella parte inferiore di ListView. Sono a conoscenza di transcriptMode e stackFromBottom, tuttavia il mio problema è l'ordine dei dati.Inverso ListView in Android?

Suppongo di avere 100 voci di conversazione e di voler visualizzare gli elementi 80-100, mentre 100 è l'elemento di conversazione più recente. Vorrei mostrare 80-100, che implica un ORDER BY id desc LIMIT 20 nella mia query, che costringe gli elementi ad essere ordinati da 100 a 80, il contrario di ciò di cui ho bisogno. Al momento ho qualche brutto codice di query interno, ma sento che dovrebbe esserci una soluzione più semplice basata sull'inversione del cursore o semplicemente invertendo il ListView.

+0

Non sono sicuro se avrebbe funzionato, ma si potrebbe semplicemente eseguire una query per tutti gli elementi, creare una matrice delle ultime 20 nel 'Cursor' che è tornato e quindi creare un' MatrixCursor' dalla matrice e l'uso che per la 'ListView'. Vedi http://developer.android.com/reference/android/database/MatrixCursor.html – Squonk

risposta

9

all'interno del baseAdapter, per il metodo getView(), invece di ottenere la voce nei dati in "posizione" indice, utilizzare il contrario, vale a dire: NumberOfItems meno la posizione.

come per mostrare il numero di elementi, che è anche all'interno di baseAdapter: imposta il valore restituito da getCount() per essere quello che desideri (20 nel tuo esempio, anche se 80-100 implica che dovrebbe essere 21) .

btw, sembra che tu sia un antipasto nel caso di listView. Posso suggerire di guardare questo video: http://www.youtube.com/watch?v=wDBM6wVEO70

controllare anche gli api-demo forniti dal gestore sdk. hanno un sacco di esempi lì.

+0

Grazie, penso che questo sia il modo migliore per andare. Stavo considerando la creazione di sottoclassi di Cursor per creare un ReverseCursor e anche considerare l'alterazione di ListView, ma il pezzo tra loro è la scelta più chiara. Ho appena assistito al talk di I/O 2009 di Romain sulle prestazioni di Android che ha fatto cenno in questa direzione, grazie per il puntatore al talk di ListView. – bjdodson

0

La query per i record utilizzando BETWEEN parola chiave sembra la soluzione più semplice per me.

+0

Grazie, TRA è utile ma non funziona abbastanza per me, dal momento che non voglio aggiungere una query per trovare dove si trova l'ultimo dato. – bjdodson

10

Utilizzare questa getItem Metodo all'interno del vostro adattatore per ordine inverso:

@Override 
public Object getItem(int position) { 
    return super.getItem(super.getCount() - position - 1); 
} 
+0

Potrebbe dirci come sovrascrivere il metodo getItem() nell'adattatore? – Apurva

+0

@Apurva: Non capisco il tuo problema qui? È necessaria l'annotazione Override. –

+0

Ma mostra un messaggio che @Override non è consentito qui. Sto cercando di scavalcare il metodo onCreate – Apurva

1

Questo codice è lavorato per me quando si tira i dati dal database.

cs.moveToPosition(super.getCount() - position - 1); //cs is Cursor