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

Respuestas:

386

Para un desplazamiento directo:

getListView().setSelection(21);

Para un desplazamiento suave:

getListView().smoothScrollToPosition(21);
HandlerExploit
fuente
¡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);  
amalBit
fuente
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!!!

Melbourne Lopes
fuente
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
        }
    });
Inet Labs
fuente
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);
Zalak Gajjar
fuente
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);
EngineSense
fuente
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. 

}
});
Zar E Ahmer
fuente
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);

Vijay
fuente
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);
Prasanna Ramaswamy
fuente
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

janatan
fuente
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 :)

Basil Rawa
fuente
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);
Rahul Ogale
fuente
-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);
                    }

                }
            });
        }
Panciz
fuente