我正在尝试构建自己的网格视图功能 - 在GridView
. 我唯一无法解决的是如何获取GridView
.
getScrollY()
总是返回 0,并且onScrollListener
的参数只是一系列可见的子视图,而不是实际的滚动位置。
这似乎不是很困难,但我只是无法在网上找到解决方案。
这里有人有想法吗?
我正在尝试构建自己的网格视图功能 - 在GridView
. 我唯一无法解决的是如何获取GridView
.
getScrollY()
总是返回 0,并且onScrollListener
的参数只是一系列可见的子视图,而不是实际的滚动位置。
这似乎不是很困难,但我只是无法在网上找到解决方案。
这里有人有想法吗?
我没有找到任何好的解决方案,但这个至少能够保持像素完美的滚动位置:
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);
这样你就不能得到一个绝对的滚动位置,而是一个可见的项目+位移对。
笔记:
希望对您有所帮助并给您一个想法。
在 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 中实现,但它们可以很容易地重新编码为外部函数。