2012-06-07 7 views
8

Gibt es eine einfache Möglichkeit, einen ListView in umgekehrter Reihenfolge anzuzeigen? Ich versuche, eine Konversations-basierte App zu erstellen und möchte, dass die letzten Einträge am Ende der ListView stehen. Ich kenne transkriptmodus und stackFromBottom, aber mein Problem ist die Reihenfolge der Daten.Invertierte ListView in Android?

Angenommen, ich habe 100 Konversationselemente und möchte Elemente 80-100 anzeigen, wobei 100 das letzte Konversationselement ist. Ich möchte 80-100 zeigen, was eine ORDER BY ID DESC LIMIT 20 in meiner Abfrage beinhaltet, die die zu sortierenden Artikel 100 zu 80 zwingt, das Gegenteil dessen, was ich brauche. Ich habe momentan einen unangenehmen inneren Abfragecode, aber ich habe das Gefühl, dass es eine einfachere Lösung geben sollte, die auf der Umkehrung des Cursors oder einfach dem Invertieren der ListView basiert.

+0

nicht sicher, ob es funktionieren würde, aber man könnte einfach für alle Elemente abfragen, einen Array der letzten 20 in dem 'Cursor' erstellen, die zurückgegeben wird und dann eine' MatrixCursor' aus dem Array erstellen und verwenden, die für die 'ListView'. Siehe http://developer.android.com/reference/android/database/MatrixCursor.html – Squonk

Antwort

9

innerhalb der baseAdapter, für die getView() Methode, statt das Produkt in den Daten in dem Index "Position" erhalten, verwenden Sie das Gegenteil, was bedeutet: numberOfItems minus die Position.

wie zum Anzeigen der Anzahl der Elemente, die auch im baseAdapter enthalten sind: Setzen Sie den von getCount() zurückgegebenen Wert auf den gewünschten Wert (20 in Ihrem Beispiel, obwohl 80-100 bedeutet, dass es 21 sein sollte) .

übrigens scheint es, Sie sind ein Starter im Falle von ListView. Ich schlage vor, dieses Video anzuschauen: http://www.youtube.com/watch?v=wDBM6wVEO70

Überprüfen Sie auch die API-Demos von der SDK-Manager zur Verfügung gestellt. Sie haben dort viele Beispiele.

+0

Danke, ich denke, das ist der beste Weg zu gehen. Ich habe erwogen, Cursor zu subclassieren, um einen ReverseCursor zu erstellen, und darüber nachzudenken, ListView zu ändern, aber das Stück zwischen ihnen ist die klare Wahl. Ich habe Romains 2009 I/O-Talk auf Android-Performance gesehen, die in diese Richtung deutete, danke für den Hinweis auf den ListView-Talk. – bjdodson

0

Abfrage für Datensätze mit BETWEEN Schlüsselwort scheint die einfachste Lösung für mich.

+0

Danke, BETWEEN ist hilfreich, aber funktioniert nicht ganz für mich, da ich keine Abfrage hinzufügen möchte, um herauszufinden, wo das letzte Stück Daten ist. – bjdodson

10

verwendet getItem Methode in Ihrem Adapter für umgekehrte Reihenfolge:

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

Können Sie bitte sagen, wie getItem() Methode im Adapter überschrieben wird? – Apurva

+0

@Apurva: Ich verstehe dein Problem hier nicht? Sie benötigen die Override-Annotation. –

+0

Aber es zeigt eine Nachricht, dass @Override hier nicht erlaubt ist. Ich versuche, in OnCreate-Methode – Apurva

1

Dieser Code ist für mich gearbeitet, wenn Daten aus der Datenbank ziehen.

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