Как получить положение прокрутки из GridView?
Я пытаюсь создать свои собственные функции просмотра сетки - расширение на GridView
.
Единственное, что я не могу решить, - это получить текущую позицию прокрутки GridView
.
getScrollY()
всегда возвращает 0, а параметры onScrollListener
- это всего лишь диапазон видимых дочерних видов, а не фактическая позиция прокрутки.
Это не кажется очень сложным, но я просто не могу найти решение в Интернете.
Кто-нибудь, у кого есть идея?
Ответы
Ответ 1
Я не нашел хорошего решения,
но этот, по крайней мере, способен поддерживать вид положения прокрутки в пикселях:
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+ вместо двух последних строк.
Надеюсь, что это поможет и даст вам идею.
Ответ 2
В 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, но их можно легко перекодировать как внешние.