Android:垂直viewpager中的RecyclerView

我想在一个垂直的viewpager中实现一个recyclerview。 我目前的布局如下所示

VerticalViewpager - Fragment1 - ImageView - Fragment2 - RecyclerView 

如果我从Fragment1滑动到Fragment2一切正常。 我可以在回收站内上下滚动。 如果我尝试滑动/回滚到Fragment1,就会出现问题。

如果用户已经滚动到回收站视图的顶部,我想将下一个“向上”滚动事件转发到垂直viewpager。 我试图重写onInterceptTouchEvent方法,但不幸的是仍然没有成功。 有任何想法吗? 谢谢你的帮助 :)

Solutions Collecting From Web of "Android:垂直viewpager中的RecyclerView"

你需要禁用scroll 。 尝试使用recyclerView.setNestedScrollingEnabled(false);

1)您需要使用支持库23.2.0(或)2)以上和recyclerView高度将是wrap_content。 3)recyclerView.setNestedScrollingEnabled(false)

但通过这样做,回收模式不起作用。 (即所有的视图都会一次加载,因为wrap_content需要完整的recyclerView的高度,所以它将一次绘制所有的回收站视图,没有视图将被回收)。 尽量不要使用这种模式util。

 recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrolled (RecyclerView recyclerView,int dx, int dy) { int topRowVerticalPosition = (recyclerView == null || recyclerView.getChildCount() == 0) ? 0 : recyclerView.getChildAt(0).getTop(); if (topRowVerticalPosition >= 0) { //top position } } @Override public void onScrollStateChanged (RecyclerView recyclerView,int newState) { super.onScrollStateChanged(recyclerView, newState); } }); 

通过使用这个代码,你可以find用户是否处于最高位置。 在这个位置上,你可以使视图寻呼机移动到你想要的位置。

如果您从RecyclerView访问VerticalViewPager ,则可以扩展RecyclerView并检查canScrollVertically(-1)并将触摸事件转发到viewpager

你需要在父窗口中禁止nestedscroll我有这个新的工具,你可以尝试下面的链接https://github.com/liuxiaocong/VerticalViewpage

我有同样的问题。 印度先生的回答是有帮助的,但正如你所评论的那样,它只是有时候起作用。

我做的是

 recyclerView.setOnTouchListener(new View.OnTouchListener() { public float speed; public VelocityTracker mVelocityTracker; @Override public boolean onTouch(View v, MotionEvent event) { int index = event.getActionIndex(); int action = event.getActionMasked(); int pointerId = event.getPointerId(index); switch (action) { case MotionEvent.ACTION_DOWN: if(mVelocityTracker == null) { mVelocityTracker = VelocityTracker.obtain(); } else { mVelocityTracker.clear(); } mVelocityTracker.addMovement(event); break; case MotionEvent.ACTION_MOVE: if(mVelocityTracker != null) { mVelocityTracker.addMovement(event); mVelocityTracker.computeCurrentVelocity(1000); speed = VelocityTrackerCompat.getYVelocity(mVelocityTracker, pointerId); } break; case MotionEvent.ACTION_UP: int topRowVerticalPosition = (recyclerView == null || recyclerView.getChildCount() == 0) ? 0 : recyclerView.getChildAt(0).getTop(); if(speed > 500 && topRowVerticalPosition >= 0) { ReaderFragmentParent parent = (ReaderFragmentParent) getActivity(); ReaderPager pager = parent.getPager(); if(pager != null) { pager.setCurrentItem(pager.getCurrentItem()-1); } } return false; case MotionEvent.ACTION_CANCEL: mVelocityTracker.recycle(); break; } return false; } }); 

在ACTION_UP上,我validation速度是否大于500,这意味着它正在以一个被认为的速度上升,topRowVerticalPosition意味着它在回收站的顶部。 然后,我得到ViewPager和setCurrentItem到以前的项目。

这有点肮脏的黑客,但它是唯一的方式,我发现看起来像一个很好的滚动垂直ViewPager

 mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrolled (RecyclerView recyclerView,int dx, int dy) { } @Override public void onScrollStateChanged (RecyclerView recyclerView,int newState) { super.onScrollStateChanged(recyclerView, newState); if (!mRecyclerView.canScrollVertically(-1) && newState == 0) { Log.e("canScrollVertically", mRecyclerView.canScrollVertically(-1)+""); verticalViewPager.setCurrentItem(0, true); } } });