Cómo obtener la posición de desplazamiento de GridView?
Estoy intentando construir mis propias funciones de la vista de la rejilla – extendiéndose en el GridView
. Lo único que no puedo resolver es cómo obtener la posición de desplazamiento actual del GridView
.
getScrollY()
siempre devuelve 0, y los onScrollListener
del onScrollListener
son sólo un rango de vistas secundarias visibles, no la posición de desplazamiento real.
- ¿Cómo calculo la altura requerida de un GridView que está dentro de un ScrollView en Android?
- Volley funciona en WIFI pero no en 3G
- Actualización del primer elemento gridview después de que getView lo infla dos veces
- Cómo agregar CardView dentro de Gridview
- Número de filas de una vista de cuadrícula en android
Esto no parece muy difícil, pero no puedo encontrar una solución en la web.
¿Alguien aquí que tiene una idea?
- Eliminar elemento de GridView
- Pinterest como Grid en Android
- Gridview con diseño (imageview + imagebutton) para cada valor
- Desplazamiento de desplazamiento de GridView
- ¿Por qué hay pixeles adicionales alrededor de mi Android GridView?
- Imagen más grande para el primer elemento del android de gridview
- GridView con colSpan y rowSpan
- Visualización de imágenes de una carpeta específica de la tarjeta SD mediante una vista de cuadrícula
No he encontrado ninguna buena solución, pero esta es al menos capaz de mantener la posición de desplazamiento tipo de píxel-perfectamente:
int offset = (int)(<your vertical spacing in dp> * getResources().getDisplayMetrics().density); int index = mGrid.getFirstVisiblePosition(); final View first = container.getChildAt(0); if (null != first) { offset -= first.getTop(); } // Destroy the position through rotation or whatever here! mGrid.setSelection(index); mGrid.scrollBy(0, offset);
Por eso no se puede obtener una posición de desplazamiento absoluta, sino un par de elementos visible + desplazamiento.
NOTAS:
- Esto es para la API 8+.
- Se puede obtener con mGrid.getVerticalSpacing () en la API 16+.
- Puede utilizar mGrid.smoothScrollToPositionFromTop (índice, desplazamiento) en API 11+ en lugar de las dos últimas líneas.
Espero que ayude y te da una idea.
En Gingerbread, GridView getScrollY () funciona en algunas situaciones, y en algunas no. Aquí hay una alternativa basada en la primera respuesta. Se debe conocer la altura de la fila y el número de columnas (y todas las filas deben tener la misma altura):
public int getGridScrollY() { int pos, itemY = 0; View view; pos = getFirstVisiblePosition(); view = getChildAt(0); if(view != null) itemY = view.getTop(); return YFromPos(pos) - itemY; } private int YFromPos(int pos) { int row = pos / m_numColumns; if(pos - row * m_numColumns > 0) ++row; return row * m_rowHeight; }
La primera respuesta también da una buena pista sobre cómo desplazar un GridView de píxeles. Esta es una solución generalizada que desplaza un GridView equivalente a scrollTo (0, scrollY):
public void scrollGridToY(int scrollY) { int row, off, oldOff, oldY, item; // calc old offset: oldY = getScrollY(); // getGridScrollY() will not work here row = oldY / m_rowHeight; oldOff = oldY - row * m_rowHeight; // calc new offset and item: row = scrollY / m_rowHeight; off = scrollY - row * m_rowHeight; item = row * m_numColumns; setSelection(item); scrollBy(0, off - oldOff); }
Las funciones se implementan dentro de una GridView subclasificada, pero pueden ser fácilmente recodificadas como externas.
- Cómo obtener una posición de elemento de lista haciendo clic en el botón dentro de él?
- Aplicación en el mercado de Android: las notificaciones HTTP no vienen