2012-06-07 33 views
8

¿Hay alguna manera fácil de mostrar un ListView en orden inverso? Intento crear una aplicación basada en conversaciones y me gustaría que las entradas más recientes estén en la parte inferior de ListView. Soy consciente de transcriptMode y stackFromBottom, sin embargo, mi problema es el orden de los datos.ListView invertido en Android?

Supongamos que tengo 100 elementos de conversación y quiero mostrar los elementos 80-100, siendo 100 el elemento de conversación más reciente. Me gustaría mostrar 80-100, lo que implica una ORDEN BY id desc LÍMITE 20 en mi consulta, lo que obliga a ordenar los elementos de 100 a 80, lo contrario de lo que necesito. Actualmente tengo un código de consulta interna desagradable, pero siento que debería haber una solución más simple basada en invertir el cursor o simplemente invertir el ListView.

+0

No estoy seguro de si funcionaría, pero simplemente podría preguntar para todos los artículos, crear una matriz de los últimos 20 en el 'Cursor' que se devuelve y luego crear un' MatrixCursor' de la matriz y el uso que de la 'ListView'. Ver http://developer.android.com/reference/android/database/MatrixCursor.html – Squonk

Respuesta

9

dentro del baseAdapter, por el método getView(), en lugar de conseguir el artículo en los datos de la "posición" de índice, utilice el contrario, lo que significa: numberOfItems menos la posición.

en cuanto a mostrar el número de elementos, también dentro del adaptador base: establezca el valor devuelto por getCount() para que sea el que desea (20 en su ejemplo, aunque 80-100 implica que debe ser 21) .

Por cierto, parece que eres un principiante en el caso de listView. puedo sugerir que mire este video: http://www.youtube.com/watch?v=wDBM6wVEO70

también verifique las api-demos provistas por el administrador de sdk. ellos tienen muchos ejemplos allí.

+0

Gracias, creo que esta es la mejor manera de hacerlo. Estaba considerando la creación de subclases de Cursor para crear un Cursor inverso, y también considerando modificar ListView, pero la pieza entre ellos es la opción más clara. Acabo de ver la charla sobre E/S 2009 de Romain sobre el rendimiento de Android que apuntaba en esta dirección, gracias por el puntero a la conversación de ListView. – bjdodson

0

La búsqueda de registros utilizando la palabra clave BETWEEN parece ser la solución más fácil para mí.

+0

Gracias, ENTRE es útil, pero no funciona para mí, ya que no quiero agregar una consulta para encontrar dónde está el último dato. – bjdodson

10

Utilice esta getItem Método dentro de su Adaptador para orden inverso:

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

¿Podría decirnos cómo anular el método getItem() en el adaptador? – Apurva

+0

@Apurva: ¿No entiendo tu problema aquí? Necesita la anulación de anulación .. –

+0

pero muestra un mensaje de que @Override no está permitido aquí. Estoy intentando sobrescribir el método onCreate – Apurva

1

Este código se trabajó para mí cuando se tira de los datos de la base de datos.

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