2010-07-22 7 views
9

Soy consciente de setSelection(), setSelectionFromTop() y setSelectionAfterHeaderView(), pero ninguno de ellos parece hacer lo que quiero.Configuración de la posición de desplazamiento ListView muy bien en Android

Dado un elemento en la lista, quiero desplazarme para que esté a la vista. Si el artículo está sobre la ventana visible de la lista, quiero desplazarme hasta que el artículo sea el primer elemento visible en la lista; si el artículo está debajo de la ventana visible, quiero que se desplace hacia arriba hasta que sea el último elemento visible de la lista. Si el elemento ya está visible, no quiero que se produzca ningún desplazamiento.

¿Cómo puedo hacer esto?

+0

¿Por qué no funcionan los métodos mencionados? ¿Qué sucede cuando configuraSelección en el artículo que desea? (Soy consciente de que es una vieja pregunta. Si ya ha resuelto esto, publique su solución, lo agradecería) – HXCaine

+0

@ T3Roar: Lo resolví, con una combinación de setSelection() y setSelectionFromTop(), Preocuparse por la altura de la lista y la altura del artículo, y por supuesto la posición del artículo dentro de la lista. Es un desastre, me temo, y no puedo compartir el código de todos modos, pero es solucionable. Tal vez si tengo la oportunidad escribiré una solución genérica que pueda compartir, pero lo que tengo ahora no es útil fuera del contexto en el que lo tengo. ¡Lo siento! –

+1

Bueno, me alegro de que solo haya usado SetSelection() para lograrlo en lugar de alguna otra solución loca. Gracias por responder :) – HXCaine

Respuesta

15

Ocurre porque ListView no se ha creado todavía. Tratar de publicar ejecutable, tales como:

getListView().postDelayed(new Runnable() {   
    @Override 
    public void run() { 
     lst.setSelection(15); 
    } 
},100L); 
4

Creo, que estaba buscando lo mismo, entonces me encontré con la siguiente solución:

if (listview.getFirstVisiblePosition() > pos 
    || listview.getLastVisiblePosition() <= pos) { 
    listview.smoothScrollToPosition(pos); 
} 

API se requiere 8 utilizar smoothScrollToPosition (que es un mínimo razonable de todos modos) para que esté al tanto.

3

La respuesta de Sergey funciona, pero creo que la forma correcta de hacerlo es configurar un observador para recibir una notificación cuando se haya creado el ListView.

listView.getViewTreeObserver().addOnGlobalLayoutListener(
    new ViewTreeObserver.OnGlobalLayoutListener() { 
@Override 
public void onGlobalLayout() { 
    scrollTo(scrollToPosition); 
    listView.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
} 
}); 
+1

esta es una solución mejor, pero no olvides eliminar el oyente: http://developer.android.com/reference/android/view/ViewTreeObserver.html#removeGlobalOnLayoutListener(android.view.ViewTreeObserver.OnGlobalLayoutListener) – Rocel

+0

Gracias Rocel. La lista de líneasView.getViewTreeObserver(). RemoveGlobalOnLayoutListener (esto) hace eso –

0

Una mejor solución para Sergey's answer es llamar setSelection() más tarde en el ciclo de vida Actividad/Fragmento, tal vez en onStart(). De esta manera, tiene la garantía de que la Vista está lista en lugar de utilizar un retraso arbitrario.

Cuestiones relacionadas