¿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 ListView
al índice 21 de mi String[]
.
¿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 ListView
al índice 21 de mi String[]
.
Respuestas:
Para un desplazamiento directo:
getListView().setSelection(21);
Para un desplazamiento suave:
getListView().smoothScrollToPosition(21);
smoothScrollToPosition
no funciona, alguna sugerencia?
listView.post(() -> listView.smoothScrollToPosition());
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);
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!!!
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
}
});
El Listview
desplazamiento 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);
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);
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.
}
});
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);
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
-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 :)
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);
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);
}
}
});
}