Desplazarse por progtwigción a una posición específica en un ListView de Android

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

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

Para un desplazamiento directo:

 getListView().setSelection(21); 

Para un desplazamiento suave:

 getListView().smoothScrollToPosition(21); 

Para un SmoothScroll con duración de desplazamiento:

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

Parámetros
posición -> Posición para desplazarse a
desplazamiento —-> distancia deseada en píxeles de posición desde la parte superior de la vista cuando finaliza el desplazamiento
duración-> Número de milisegundos para usar para el desplazamiento

Nota: de API 11.

La respuesta de HandlerExploit fue lo que estaba buscando, pero mi lista de lista es bastante larga y también con el desplazamiento alfabético. Luego descubrí que la misma función puede tomar otros parámetros también 🙂


Editar: (De la sugerencia de AFD)

Para colocar la selección actual:

 int h1 = mListView.getHeight(); int h2 = listViewRow.getHeight(); mListView.smoothScrollToPositionFromTop(position, h1/2 - h2/2, duration); 

Ponga su 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); 

¡¡¡ACLAMACIONES!!!

Configuré OnGroupExpandListener y anulé onGroupExpand () como:

y use el método setSelectionFromTop () que establece el elemento seleccionado y coloca la selección y los píxeles en el borde superior de ListView. (Si está en modo táctil, el elemento no se seleccionará, pero seguirá estando correctamente colocado) (documentos de android)

  yourlist.setOnGroupExpandListener (new ExpandableListView.OnGroupExpandListener() { @Override public void onGroupExpand(int groupPosition) { expList.setSelectionFromTop(groupPosition, 0); //your other code } }); 

El desplazamiento de Listview colocará en la parte superior de forma predeterminada, pero desea desplazarse si no está visible y luego usar esto:

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

Manejo del desplazamiento de ListView usando UP / Down usando.button

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

 public View.OnClickListener onChk = new View.OnClickListener() { public void onClick(View v) { int index = list.getFirstVisiblePosition(); getListView().smoothScrollToPosition(index+1); // For increment. } }); 

Si alguien está buscando una funcionalidad similar, como la aplicación Gmail,

El desplazamiento Listview se colocará en la parte superior de forma predeterminada. Gracias por la pista. amalBit. Solo restarlo. 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); 

Si quiere saltar directamente a la posición deseada en una lista, solo use

listView.setSelection (int position);

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

listView.smoothScrollToPosition (int position);

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 llama a este método como:

 timerDelayRunForScroll(400); 

su fácil selección list-view.set (usted pos); o puede guardar su posición conpreferencia compartida y cuando comienza la actividad obtiene preferencias y setseletion a esa int

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

Como lo sugiere @Nepster, implemento el desplazamiento programáticamente utilizando 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()0){ lwresult.smoothScrollToPosition(lwresult.getFirstVisiblePosition()-5); }else{ lwresult.smoothScrollToPosition(0); } } }); }