2012-09-19 42 views
5

Tengo una vista que contiene un ListView enlazado a un adaptador de cursor. Cuando el cambio de contenido cursor Quiero mantener el ListView en la parte superior y luego en mi adaptador de encargo del cursor añadí:android ListView: scrollTo no funciona

@Override 
protected void onContentChanged() { 
    // ... 
    myListView.scrollTo(0, 0); 
} 

pero esto no funciona. Luego leo en alguna parte para poner en cola esta acción como esta:

myListView.post(new Runnable() { 
    public void run() { 
     myListView.scrollTo(0, 0); 
    } 
}); 

pero esto tampoco funciona.

¿Cómo puedo mantener el ListView en la parte superior cuando cambia su contenido?

EDIT:

Sólo por intentarlo, he añadido un botón de llamada y scrollTo() en su OnClickListener y no funcionó! Qué me estoy perdiendo ?

Respuesta

28

En lugar de scrollTo, tratar setSelection (0) para llegar a la primera posición de la vista de lista.

+3

IT WORKS !! ¿¿Pero por qué?? ¿Y por qué scrollTo() no funciona? – Alexis

+1

@jafar esto debería funcionar. ListView's scrollTo se aplica a ListView it self, pero listview no se puede desplazar, por lo que el resultado no es nada. setSelection hace el truco porque se aplica al adaptador – weakwire

+0

de listview, por favor marque como respuesta si resuelve su problema ... gracias –

5

ListView de scrollTo se aplica a la auto ListView como un View

setSelection(0) hace el truco porque se aplica al adaptador de la vista de lista

+0

También tenga en cuenta que 'setSelection' necesita ser llamado después de' adapter.notifyDataSetChanged() '. – TWiStErRob

5

hice funciones que podrían ser útiles para otros por desplazamiento vista de lista, para la que trabajan me en cada versión de Android, emulador y dispositivo, aquí itemheight es el alto de vista fijo en la vista de lista.

int itemheight=60; 
public void scrollToY(int position) 
{ 
    int item=(int)Math.floor(position/itemheight); 
    int scroll=(int) ((item*itemheight)-position); 
    this.setSelectionFromTop(item, scroll);// Important 
} 
public void scrollByY(int position) 
{ 
    position+=getListScrollY(); 
    int item=(int)Math.floor(position/itemheight); 
    int scroll=(int) ((item*itemheight)-position); 
    this.setSelectionFromTop(item, scroll);// Important 
} 
public int getListScrollY() 
{ 
    try{ 
    //int tempscroll=this.getFirstVisiblePosition()*itemheight;// Important 
    View v=this.getChildAt(0); 
    int tempscroll=(this.getFirstVisiblePosition()*itemheight)-v.getTop();// Important 
    return tempscroll; 
    }catch(Exception e){} 
    return 0; 
} 
+0

las funciones anteriores se deben agregar a la clase que hereda/extiende ListView – Diljeet

+0

La altura de la codificación no es una buena idea, las listas pueden manejar elementos mixtos, así como texto de líneas múltiples con altura variable. También escribí un montón de 'ListView' de lujo que no necesitaban extender la clase real. Considere al llamar 'View.measure (int, int)' para la altura de un elemento específico, después de obtenerlo del adaptador. – TWiStErRob

+0

Tiene razón, la altura de codificación difícil no es el enfoque correcto, pero las listas de vista comúnmente usadas tienen elementos de altura fijos, y las funciones de desplazamiento no funcionan en ellas, esto es solo una solución para la funcionalidad de desplazamiento. puede modificarlos de acuerdo con usted, "View.measure (int, int)" esto también se puede usar, depende de usted cómo los modificará para que se adapte a sus necesidades. – Diljeet