Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/206.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何从GridView获取滚动位置?_Android_Gridview_Scroll_Position_Scroll Offset - Fatal编程技术网

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