2010-10-27 11 views
14

Tengo un problema con mi ListView (usando CursorAdapte r). Cuando llamo al getListView().getLastVisiblePosition() estoy recibiendo -1. Esto es un problema ya que mi lista está llena de elementos. Además, getListView().getFirstVisiblePosition() siempre devuelve 0, sin importar dónde estoy desplazado en la lista. ¿Algunas ideas?getLastVisiblePosition return -1

Tiene algo que ver con startManagingCursor

@Override 
    public void changeCursor(Cursor cursor) { 
     super.changeCursor(cursor); 
     MyActivity.this.mCursor = cursor; 
     //startManagingCursor(MyActivity.this.mCursor); 
    } 

Si comento hacia fuera startManagingCursor, todo funciona bien. También intenté agregar stopManagingCursor() antes de cambiar el Cursor y seguir teniendo el mismo problema.

+0

¿Alguien puede ofrecer alguna idea adicional? Id realmente me gusta estar usando startManagingCursor – Andrew

+0

¿La vista de lista ya está poblada cuando llamas a '.getLastVisiblePosition()'? –

Respuesta

0

Supongo que sus métodos getItem(int position) y getItemId(int position) no están definidos correctamente en su adaptador.

+0

No están definidos en absoluto. Nunca lo han sido. Todo estaba funcionando bien hasta que comencé a utilizar startManagingCursor (porque recibía errores de "Finalización de un Cursor que no se ha desactivado o cerrado"). Tampoco veo cómo esos dos métodos afectarían esto. Le pido a Android la primera y la última posición visible; no por los datos. – Andrew

+0

Sí, y estoy seguro de que getLastPosition() usa esos 2 métodos para determinar esa información – Falmarri

+0

¿Por qué? Además, dado que no estoy anulando estos métodos, ¿por qué todo funcionaría bien cuando no inicie ManageCursor, pero fallaré una vez que lo haga? En ambos casos, no he anulado estos métodos – Andrew

32

Esto se debe a que en el momento en que llama a getListView(). GetLastVisiblePosition() la vista de lista no se representa. Puede agregar la llamada a la cola de mensajes de la vista como esta:

listview.post(new Runnable() { 
    public void run() { 
     listview.getLastVisiblePosition(); 
    } 
}); 
+0

Hombre, muchas gracias por esto. – Yar

+0

Esto tiene sentido ... Gracias luciferleo. –

+0

¡Esta debería ser la respuesta aceptada! – Virthuss

0

Incluso yo tuve el mismo problema. El caso es que getLastVisiblePosition() solo funciona cuando se está en el primer elemento de su lista de lista y, por lo demás, se devuelve nulo. Así que lo que hice es que, hice un pequeño cálculo para averiguar la posición exacta vista que he mencionado a continuación,

int LastPos=(mylist.getLastVisiblePosition()-mylist.getFirstVisiblePosition()); 

Esto devuelve la última posición exacta y sin lugar a dudas.