В 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 в подклассах, но их можно легко перекодировать как внешние.