example - listview android personalizado
asegurar visible en la vista de lista de Android? (5)
¿Hay alguna manera de asegurarme de que un elemento determinado en una vista de lista de Android sea completamente visible?
Me gustaría poder desplazarme programáticamente a un elemento específico, como cuando presiono un botón, por ejemplo.
Creo que lo que estás buscando es ListView.setSelectionFromTop() (aunque llego un poco tarde a la fiesta).
Intentalo:
public static void ensureVisible(ListView listView, int pos)
{
if (listView == null)
{
return;
}
if(pos < 0 || pos >= listView.getCount())
{
return;
}
int first = listView.getFirstVisiblePosition();
int last = listView.getLastVisiblePosition();
if (pos < first)
{
listView.setSelection(pos);
return;
}
if (pos >= last)
{
listView.setSelection(1 + pos - (last - first));
return;
}
}
Recientemente me encontré con el mismo problema, pegue mi solución aquí en caso de que alguien la necesite (estaba tratando de hacer visible el último elemento visible):
if (mListView != null) {
int firstVisible = mListView.getFirstVisiblePosition()
- mListView.getHeaderViewsCount();
int lastVisible = mListView.getLastVisiblePosition()
- mListView.getHeaderViewsCount();
View child = mListView.getChildAt(lastVisible
- firstVisible);
int offset = child.getTop() + child.getMeasuredHeight()
- mListView.getMeasuredHeight();
if (offset > 0) {
mListView.smoothScrollBy(offset, 200);
}
}
Tengo una solución más corta y, en mi opinión, mejor para hacer esto: el método ListView requestChildRectangleOnScreen está diseñado para ello.
La respuesta anterior asegura que el elemento se mostrará, pero a veces se mostrará parcialmente (es decir, cuando se encuentre en la parte inferior de la pantalla). El código siguiente garantiza que se mostrará todo el elemento y que la vista solo desplazará la zona necesaria:
private void ensureVisible(ListView parent, View view) {
Rect rect = new Rect(view.getLeft(), view.getTop(), view.getRight(), view.getBottom());
parent.requestChildRectangleOnScreen(view, rect, false);
}
ListView.setSelection()
desplazará la lista para que el elemento deseado se encuentre dentro de la ventana gráfica.