Desplácese programáticamente a una posición específica en un Android ListView


157

¿Cómo puedo desplazarme programáticamente a una posición específica en a ListView?

Por ejemplo, tengo un String[] {A,B,C,D....}, y necesito establecer el elemento visible superior del ListViewal índice 21 de mi String[].



Respuestas:


386

Para un desplazamiento directo:

getListView().setSelection(21);

Para un desplazamiento suave:

getListView().smoothScrollToPosition(21);

¡Genial, esto es exactamente lo que quiero!
jiasli

Genial, muy útil. Me ahorra tiempo. Gracias.
Neha Agarwal

Otra diferencia: la primera intenta establecerse en el medio de la lista.
Victor Pinto

11
smoothScrollToPositionno funciona, alguna sugerencia?
SweetWisher ツ

1
@SweetWisher ツ intenta retrasar la ejecución, algo así como:listView.post(() -> listView.smoothScrollToPosition());
Andy Res

64

Para una duración de desplazamiento suave con desplazamiento:

getListView().smoothScrollToPositionFromTop(position,offset,duration);


Posición de parámetros -> Posición para desplazarse al
desplazamiento ----> Distancia deseada en píxeles de posición desde la parte superior de la vista cuando el desplazamiento finaliza
duración-> Número de milisegundos que se utilizarán para el desplazamiento

Nota: desde la API 11.

La respuesta de HandlerExploit fue lo que estaba buscando, pero Mi vista de lista es bastante larga y también con desplazamiento del alfabeto. Luego descubrí que la misma función también puede tomar otros parámetros :)


Editar: (De la sugerencia de AFD)

Para posicionar la selección actual:

int h1 = mListView.getHeight();
int h2 = listViewRow.getHeight();

mListView.smoothScrollToPositionFromTop(position, h1/2 - h2/2, duration);  

Funciona bien. Para mejorar su respuesta, el desplazamiento se puede calcular como se describe en stackoverflow.com/questions/5540223/…
AFD

¿Qué es v.getHeight ()?
Panache

@Panache v es la fila de la vista de lista
amalBit

te amouuuuuu
Joao Ferreira

10

Pon tu código en el controlador de la siguiente manera,

public void timerDelayRunForScroll(long time) {
        Handler handler = new Handler(); 
        handler.postDelayed(new Runnable() {           
            public void run() {   
                try {
                    lstView.smoothScrollToPosition(YOUR_POSITION);
                } catch (Exception e) {}
            }
        }, time); 
    }

y luego llama a este método como,

timerDelayRunForScroll(100);

¡¡¡SALUD!!!


7

He configurado OnGroupExpandListener y anulo onGroupExpand () como:

y use el método setSelectionFromTop () que establece el elemento seleccionado y coloca la selección y píxeles desde el borde superior de ListView. (Si está en modo táctil, el elemento no se seleccionará, pero se colocará de manera adecuada) (documentos de Android)

    yourlist.setOnGroupExpandListener (new ExpandableListView.OnGroupExpandListener()
    {

        @Override
        public void onGroupExpand(int groupPosition) {

            expList.setSelectionFromTop(groupPosition, 0);
            //your other code
        }
    });

Necesito desplazar otra vista simultáneamente mientras desplazo lisview. El uso de setSelectionFromTop en la vista de lista para el desplazamiento bloquea el hilo de la interfaz de usuario, lo que hace que el desplazamiento de otra vista sea lento. ¿Puedes dar alguna sugerencia de cómo hacerlo?
VijayRaj

7

El Listviewdesplazamiento se colocará en la parte superior de forma predeterminada, pero desea desplazarse si no está visible, utilice esto:

if (listView1.getFirstVisiblePosition() > position || listView1.getLastVisiblePosition() < position)
            listView1.setSelection(position);

Gracias @zalak Resuelve mi problema, te doy por vencido
Mitul Bhadeshiya

5

Si alguien busca una funcionalidad similar como la aplicación Gmail,

El desplazamiento de Vista de lista se colocará en la parte superior de forma predeterminada. Gracias por la pista. amalBit. Solo restalo. Eso es.

 Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            int h1 = mDrawerList.getHeight();
            int h2 = header.getHeight();
            mDrawerList.smoothScrollToPosition(h2-h1);
        }
    }, 1000);

4

Lista de manejo Ver desplazamiento usando UP / Down usando el botón.

Si alguien está interesado en manejar la lista, vea una fila hacia arriba / abajo con el botón. luego.

public View.OnClickListener onChk = new View.OnClickListener() {
             public void onClick(View v) {

                 int index = list.getFirstVisiblePosition();
                 getListView().smoothScrollToPosition(index+1); // For increment. 

}
});

Le doy el voto positivo solo porque usted es el único que mostró una forma de obtener la posición actual, pero debería mejorar el ejemplo.
Panciz

4

Si desea saltar directamente a la posición deseada en una vista de lista simplemente use

listView.setSelection (int position);

y si quieres saltar suavemente a la posición deseada en listView solo usa

listView.smoothScrollToPosition (int posición);


3

Esto es lo que funcionó para mí. Combinación de respuestas por amalBit y Melbourne Lopes

public void timerDelayRunForScroll(long time) {
    Handler handler = new Handler(); 
    handler.postDelayed(new Runnable() {           
        public void run() {   
            try {
                  int h1 = mListView.getHeight();
                  int h2 = v.getHeight();

                  mListView.smoothScrollToPositionFromTop(YOUR_POSITION, h1/2 - h2/2, 500);  

            } catch (Exception e) {}
        }
    }, time); 
}

y luego llame a este método como:

timerDelayRunForScroll(400);

1

su fácil lista-view.set selección (pos); o puede guardar su posición con preferencia compartida y cuando comienza la actividad obtiene preferencias y establece la selección a ese int


todo lo que quería hacer era pasar automáticamente a la parte superior de la lista, sin ninguna animación de desplazamiento ... esto funcionó perfectamente para eso
RH201

1

-Si solo desea que la lista se desplace hacia arriba \ amanecer a una posición específica:

myListView.smoothScrollToPosition(i);

-si desea obtener la posición de un elemento específico en myListView:

myListView.getItemAtPosition(i);

-también esto myListView.getVerticalScrollbarPosition(i);puede ayudarte.

Buena suerte :)


0

Necesita dos cosas para definir con precisión la posición de desplazamiento de una vista de lista:

Para obtener la lista actual Ver posición de desplazamiento:

int firstVisiblePosition = listView.getFirstVisiblePosition(); 
int topEdge=listView.getChildAt(0).getTop(); //This gives how much the top view has been scrolled.

Para establecer la posición de desplazamiento de ListView:

listView.setSelectionFromTop(firstVisiblePosition,0);
// Note the '-' sign for scrollTo.. 
listView.scrollTo(0,-topEdge);

-1

Encontré esta solución para permitir el desplazamiento hacia arriba y hacia abajo usando dos botones diferentes.

Según lo sugerido por @Nepster, implemento el desplazamiento mediante programación usando getFirstVisiblePosition () y getLastVisiblePosition () para obtener la posición actual.

final ListView lwresult = (ListView) findViewById(R.id.rds_rdi_mat_list);
    .....

        if (list.size() > 0) {
            ImageButton bnt = (ImageButton) findViewById(R.id.down_action);
            bnt.setVisibility(View.VISIBLE);
            bnt.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    if(lwresult.getLastVisiblePosition()<lwresult.getAdapter().getCount()){
                        lwresult.smoothScrollToPosition(lwresult.getLastVisiblePosition()+5);
                    }else{
                        lwresult.smoothScrollToPosition(lwresult.getAdapter().getCount());

                    }
                }
            });
            bnt = (ImageButton) findViewById(R.id.up_action);
            bnt.setVisibility(View.VISIBLE);

            bnt.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    if(lwresult.getFirstVisiblePosition()>0){
                        lwresult.smoothScrollToPosition(lwresult.getFirstVisiblePosition()-5);
                    }else{
                        lwresult.smoothScrollToPosition(0);
                    }

                }
            });
        }
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.