Android 如何从GridView获取滚动位置?
我正在尝试构建自己的网格视图函数-在Android 如何从GridView获取滚动位置?,android,gridview,scroll,position,scroll-offset,Android,Gridview,Scroll,Position,Scroll Offset,我正在尝试构建自己的网格视图函数-在GridView上进行扩展。 我唯一无法解决的问题是如何获取GridView的当前滚动位置 getScrollY()总是返回0,而onScrollListener的参数只是一系列可见的子视图,而不是实际的滚动位置 这似乎不是很难,但我就是在网上找不到解决办法 这里有谁有主意吗?我没有找到好的解决办法, 但这一款至少能够完美地保持像素的滚动位置: int offset = (int)(<your vertical spacing in dp> * g
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);
int offset=(int)(*getResources().getDisplayMetrics().density);
int index=mGrid.getFirstVisiblePosition();
第一个最终视图=container.getChildAt(0);
if(null!=第一个){
offset-=first.getTop();
}
//通过旋转或其他方式破坏该位置!
经理选举(索引);
经理ID.scrollBy(0,偏移量);
这样你就不能得到一个绝对的滚动位置,而是一个可见的项目+位移对
注:- 这是针对API 8+的
- 可以使用API 16+中的mGrid.getVerticalSpacing()获取
- 您可以在API 11+中使用mGrid.smoothScrollToPositionFromTop(索引,偏移量),而不是最后两行
希望这对您有所帮助并给您一个想法。在姜饼上,GridView getScrollY()在某些情况下有效,在某些情况下无效。以下是基于第一个答案的备选方案。必须知道行高和列数(所有行的高度必须相等): 第一个答案还提供了一个关于如何在GridView中滚动像素的好线索。下面是一个通用解决方案,它将滚动一个与scrollTo(0,scrollY)等价的GridView:
这些函数是在子类GridView中实现的,但它们可以很容易地重新编码为外部函数。容器代表什么?请根据我模糊的记忆告诉我这是一个复制/粘贴错误,应该是mGrid。@SalmanAshraf包含元素的视图,尝试mGrid其他方式垂直间距意味着什么?@Attila Molnár不客气-我真的很惊讶这仍然有用,并且在4.5年后和十几个API版本后实际工作。修复了第一个示例中的一个错误。
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;
}
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);
}