private float scrollDownY;
private float scrollMoveY;
mGridView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent motionEvent) { switch (motionEvent.getAction()) { case MotionEvent.ACTION_DOWN: scrollDownY = motionEvent.getY(); break; case MotionEvent.ACTION_MOVE: scrollMoveY = motionEvent.getY(); mScrollView.requestDisallowInterceptTouchEvent(true); mGridView.setOnScrollListener(new AbsListView.OnScrollListener() { @Override public void onScrollStateChanged(AbsListView absListView, int i) { } @Override public void onScroll(AbsListView absListView, int i, int i1, int i2) { if (scrollMoveY - scrollDownY > 0 && absListView.getFirstVisiblePosition() == 0) {//在顶端的时候 mScrollView.requestDisallowInterceptTouchEvent(false); } else if (scrollMoveY - scrollDownY < 0 && absListView.getLastVisiblePosition() == (absListView.getCount() - 1)) {//当在底部的时候 mScrollView.requestDisallowInterceptTouchEvent(false); } } }); break; } return false; } });
但是需要在GridView的Adapter中添加两条无用数据,即在第一条添加一个无用数据,在最后一条添加一条无用数据,为了
方式滑动特别慢时,
absListView.getFirstVisiblePosition() 和
absListView.getLastVisiblePosition() 不好用。
会出现向下滑动时,刚看见提一条GridView就不滑动了,和向上滑刚出现最后一条GridView就不滑动了的现象。
这时你添加的无用的 Header和 Footer 就起作用了。
注意:如果你添加的 Header 和 Footer 布局和你的内容布局不一致时,GridView的 高需要写定值。