20

我正在尝试构建自己的网格视图功能 - 在GridView. 我唯一无法解决的是如何获取GridView.

getScrollY()总是返回 0,并且onScrollListener的参数只是一系列可见的子视图,而不是实际的滚动位置。

这似乎不是很困难,但我只是无法在网上找到解决方案。

这里有人有想法吗?

4

2 回答 2

13

我没有找到任何好的解决方案,但这个至少能够保持像素完美的滚动位置:

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+。
  • 您可以在 API 16+ 中使用 mGrid.getVerticalSpacing()。
  • 您可以在 API 11+ 中使用 mGrid.smoothScrollToPositionFromTop(index, offset) 而不是最后两行。

希望对您有所帮助并给您一个想法。

于 2012-10-09T08:04:49.007 回答
1

在 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 进行像素滚动提供了一个很好的线索。这是一个通用的解决方案,它将滚动一个等效于 scrollTo(0, scrollY) 的 GridView:

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 中实现,但它们可以很容易地重新编码为外部函数。

于 2013-05-15T00:36:09.057 回答