VerticalViewPager垂直滑动内的GridView

时间:2015-04-30 11:53:04

标签: java android gridview android-viewpager

我有自定义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中向后滚动会被禁用,这会导致不自然。

1 个答案:

答案 0 :(得分:0)

您想要做的事情与Google的SwipeToRefreshLayout基本相同。它会在true/false期间返回onInterceptTouchEvent,具体取决于方法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);
}