How to get scroll position from GridView?

只谈情不闲聊 提交于 2019-11-27 15:48:41

问题


I am trying to build my own grid view functions - extending on the GridView. The only thing I cannot solve is how to get the current scroll position of the GridView.

getScrollY() does always return 0, and the onScrollListener's parameters are just a range of visible child views, not the actual scroll position.

This does not seem very difficult, but I just can't find a solution in the web.

Anybody here who have an idea?


回答1:


I did not find any good solution, but this one is at least able to maintain the scroll position kind of pixel-perfectly:

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);

By that you can not get an absolute scroll position, but a visible item + displacement pair.

NOTES:

  • This is meant for API 8+.
  • You can get with mGrid.getVerticalSpacing() in API 16+.
  • You can use mGrid.smoothScrollToPositionFromTop(index, offset) in API 11+ instead of the last two lines.

Hope that helps and gives you an idea.




回答2:


On Gingerbread, GridView getScrollY() works in some situations, and in some doesn't. Here is an alternative based on the first answer. The row height and the number of columns have to be known (and all rows must have equal height):

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;
}

The first answer also gives a good clue on how to pixel-scroll a GridView. Here is a generalized solution, which will scroll a GridView equivalent to 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);
}

The functions are implemented inside a subclassed GridView, but they can be easily recoded as external.



来源:https://stackoverflow.com/questions/6125013/how-to-get-scroll-position-from-gridview

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!