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.

Esto no parece muy difícil, pero no puedo encontrar una solución en la web.

¿Alguien aquí que tiene una idea?

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.

  • GridView, GridLayout o TableLayout?
  • Cómo hacer la vista de cuadrícula de Android - espaciamiento vertical dinámico?
  • ¿Cómo tomar una captura de pantalla de gridview incluyendo todos los elementos de la cuadrícula?
  • GridView y el desorden del icono mientras que usa "si (convertView == null)"
  • Android GridView carga los elementos verticalmente
  • Mi vista de cuadrícula muestra sólo una fila
  • Android - RecyclerView espaciado entre elementos en una cuadrícula
  • ¿Cómo se puede utilizar la barra de desplazamiento horizontal de gridview en android?
  • GridView con desplazamiento horizontal
  • Cómo poner GridView en ScrollView
  • Hacer cuadrados los elementos de GridView
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.