studio - Desplazarse por programación a una posición específica en un ListView de Android
listview dinamico android studio (11)
¿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[]
.
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.
}
});
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);
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);
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()<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);
}
}
});
}
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);
Para un desplazamiento directo:
getListView().setSelection(21);
Para un desplazamiento suave:
getListView().smoothScrollToPosition(21);
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!!!
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);
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