2011-05-25 18 views
17

Estoy tratando de crear mis propias funciones de vista de cuadrícula, que se extienden en el GridView. Lo único que no puedo resolver es cómo obtener la posición de desplazamiento actual del GridView.¿Cómo obtener la posición de desplazamiento desde GridView?

getScrollY() siempre devuelve 0, y los parámetros onScrollListener son solo un rango de vistas infantiles visibles, no la posición de desplazamiento real.

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

¿Alguien aquí tiene una idea?

Respuesta

12

no he encontrado ninguna solución buena, pero éste es al menos capaz de mantener el tipo posición de desplazamiento 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 que no se puede obtener una posición de desplazamiento absoluta, pero un elemento visible + par de desplazamiento.

NOTAS:

  • Esto es para 8+ API.
  • Puede obtener con mGrid.getVerticalSpacing() en API 16+.
  • Puede usar mGrid.smoothScrollToPositionFromTop (índice, desplazamiento) en API 11+ en lugar de las dos últimas líneas.

Espero que ayude y tenga una idea.

+0

contenedor ¿para qué? por favor dime –

+0

De mi vaga memoria esto es un error de copiar/pegar y debería ser mGrid. – Christoph

+0

@SalmanAshraf la Vista que contiene los elementos, pruebe mGrid de lo contrario –

0

En Gingerbread, GridView getScrollY() funciona en algunas situaciones y en otras no. Aquí hay una alternativa basada en la primera respuesta. La altura de la fila y el número de columnas que se han conocido (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 idea de cómo píxel desplazarse un GridView. Aquí es una solución generalizada, que se desplazará a un equivalente de GridView para 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 un GridView subclase, pero se pueden recodificar fácilmente como externo.

+0

Se corrigió un error en el primer ejemplo. – dslamnig

Cuestiones relacionadas