Как получить позицию прокрутки из GridView?

17

Я пытаюсь создать собственные функции просмотра сетки - на GridView . Единственное, что я не могу решить, - это получить текущую позицию прокрутки GridView .

getScrollY() всегда возвращает 0, а параметры onScrollListener - это всего лишь диапазон видимых дочерних представлений, а не фактическая позиция прокрутки.

Это не кажется очень сложным, но я просто не могу найти решение в Интернете.

Кто-нибудь, у кого есть идея?

    
задан mAx 25.05.2011 в 15:13
источник

2 ответа

12

Я не нашел хорошего решения, но этот, по крайней мере, способен поддерживать вид положения прокрутки в пикселях:

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+ вместо двух последних строк.

Надеюсь, что это поможет и даст вам идею.

    
ответ дан Christoph 09.10.2012 в 10:04
  • контейнер представляет для чего? пожалуйста скажи мне –  Salman Ashraf 11.03.2013 в 11:37
  • Из моей неопределенной памяти это ошибка копирования / вставки и должна быть mGrid. –  Christoph 11.03.2013 в 19:48
  • @SalmanAshraf View, который содержит элементы, попробуйте mGrid в противном случае –  Karl Morrison 30.11.2013 в 13:50
  • Что означает вертикальное расстояние? –  chncwang 02.12.2013 в 07:15
  • @Attila Molnár приветствуется - на самом деле я очень удивлен, что это по-прежнему полезно и фактически работает 4,5 года и дюжина версий API позже. –  Christoph 31.03.2017 в 14:41
Показать остальные комментарии
0

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

    
ответ дан dslamnig 15.05.2013 в 02:36
  • Исправлена ​​ошибка в первом примере. –  dslamnig 17.05.2013 в 03:21