我有自定义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中向后滚动会被禁用,这会导致不自然。
答案 0 :(得分:0)
您想要做的事情与Google的SwipeToRefreshLayout
基本相同。它会在true/false
期间返回onInterceptTouchEvent
,具体取决于方法canChildScrollUp()
的分辨率(对于您的代码,您将canChildScrollVertically()
这是SwipeToRefreshLayout的源代码:
在第613行,您可以看到canChildScrollUp()
方法,其中API14 +仅调用ViewCompat.canScrollVertically
或低于14检查.getFirstVisiblePosition
。
触摸事件拦截也应该很简单。
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
if(canChildScrollVertically()) return false;
else return super.onInterceptTouchEvent(ev);
}