【问题标题】:GridView inside VerticalViewPager Vertical SwipingVerticalViewPager 内的GridView 垂直滑动
【发布时间】:2015-04-30 11:53:04
【问题描述】:

我有自定义 VerticalViewPager,其中 GridView 有垂直滚动条,可以说它有 50 个项目...

现在,问题是我需要识别 Gridview 何时在顶部滚动并允许 viewpager 顶部滑动以及当 gridview 在底部滚动时允许滑动到底部...

这基本上是开箱即用的,但问题是只有当我在 gridview 上快速滑动时,它才允许我转到另一个视图...但是当我拖动其他一些元素时,例如在gridview上,那么它不需要快速触发垂直viewpager的事件...... 有人知道吗?

现在我去编辑gridview的computeVerticalScrollRange()和overScrollBy()或者设置overScrollMode,这些都没有帮助。

对不起,如果我不完全理解,我正在做的是我有一个名为 ScrollableGridView 的类,我在其中实现了如下所示的方法:

编辑 1:

@Override
    protected boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX, int scrollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent){
        if(deltaY>0){
            System.out.println("Overscrolling to BOTTOM registered from ScrollableGridView");
        }else if(deltaY<0){
            System.out.println("Overscrolling to TOP registered from ScrollableGridView");
        }
        return super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY, maxOverScrollX, 0, isTouchEvent);
    }

我可以识别用户是在列表的末尾还是开头,我只是不知道如何对 gridview 说当用户在顶部时停止推到顶部,只是让它在verticalviewpager上,但允许用户当他在 gridview 的尽头时,在 gridview 和相反的地方往下走。

我使用的方法,如 super.setEnabled(false);super.requestDisallowInterceptTouchEvent(false); 阻止了向后移动的可能性,它会阻止 gridview,因此 VerticalViewpager 将开始工作,但随后在 gridview 中向后滚动被禁用,这会很不自然。

【问题讨论】:

  • 应该和scrollview里面的两个gridview一样,你想识别gridview是在开始还是结束,让父(scrollview)做他的事情,滚动到另一个元素->到上面的gridview或以下

标签: java android gridview android-viewpager


【解决方案1】:

您想要做的基本上与来自 Google 的 SwipeToRefreshLayout 所做的相同。它在onInterceptTouchEvent 期间返回true/false,具体取决于canChildScrollUp() 方法的分辨率(对于您的代码,您可以使用canChildScrollVertically()

这里是 SwipeToRefreshLayout 的源代码:

https://android.googlesource.com/platform/frameworks/support/+/refs/heads/master/v4/java/android/support/v4/widget/SwipeRefreshLayout.java

在第 613 行,您可以看到 canChildScrollUp() 方法,对于 API14+,它只调用 ViewCompat.canScrollVertically 或者如果低于 14 则检查 .getFirstVisiblePosition

触摸事件拦截也应该很简单。

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
   if(canChildScrollVertically()) return false;
   else return super.onInterceptTouchEvent(ev);
}

【讨论】:

  • 你好,很抱歉我的反应慢,我在我的请求中添加了编辑,在那里我更好地描述了我的问题,恐怕我无法处理当我使用你的用户时将无法回滚解决方案,您认为它仍然可以正常工作吗?通过插入 onInterceptTouchEvent,您的意思是 GridView 类?非常感谢您的帮助
  • 我在度假,只在手机上看书。我无法仔细检查您下周的更新。 'onInterceptTouchEvent' 方法是 android 负责确定哪个 ViewGroup 将处理触摸事件的方法。此事件首先由系统分派给父视图,然后分派给子视图。在您的情况下,您希望 ViewPager “拦截”或不拦截触摸事件。在文档上阅读它并进行一些测试。你会到达那里
  • 非常感谢,我也遇到了同样的问题,所以才问,我会在一周内测试它,以防万一我自己无法解决它,我会打扰你,我不急于回答,我非常感谢您的帮助!非常感谢! :-)
  • 好的,所以后来我发现我从中找到代码来制作垂直寻呼机的那个人在 onInterceptTouchEvent 中设置了错误的变量,并且它从太高的差异中滑动,所以我只是更改了那个变量到小平均值以对滑动做出反应。但是谢谢你,至少知道在哪里看是有帮助的:)
猜你喜欢
  • 2013-12-16
  • 1970-01-01
  • 2019-12-11
  • 2011-08-07
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多