Как получить положение прокрутки из GridView?
Я пытаюсь построить свои собственные функции представления сетки-расширение на GridView.
Единственное, что я не могу решить, это как получить текущую позицию прокрутки GridView.
getScrollY() всегда возвращает 0, а onScrollListenerпараметры - это просто диапазон видимых дочерних представлений, а не фактическое положение прокрутки.
это не очень сложно, но я просто не могу найти решение в интернете.
кто-нибудь здесь, у кого есть идея?
2 ответов
Я не нашел хорошего решения, но этот, по крайней мере, способен поддерживать положение прокрутки в виде пикселя-отлично:
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);
таким образом, вы не можете получить абсолютную позицию прокрутки, но видимый элемент + пара смещений.
Примечания:
- это предназначено для API 8+.
 - вы можете получить с mGrid.getVerticalSpacing () в API 16+.
 - вы можете использовать mGrid.smoothScrollToPositionFromTop (индекс, смещение) в API 11+ вместо последних двух строк.
 
надеюсь, что это поможет и даст вам идею.
на Gingerbread, GridView getScrollY () работает в некоторых ситуациях, а в некоторых нет. Вот альтернатива, основанная на первом ответе. Высота строки и количество столбцов должны быть известны (и все строки должны иметь одинаковую высоту):
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;
}
первый ответ также дает хороший ключ к тому, как прокручивать пиксель в GridView. Вот обобщенное решение, которое будет прокручивать GridView, эквивалентный 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);
}
функции реализованы внутри подкласса GridView, но их можно легко перекодировать как внешние.