我有一个 viewpager,在其中一个 fragment 中,我有两个单独的 fragment ,分别包含一个垂直和一个水平的 recyclerview。
当我将水平 recyclerview 滚动到最后一个项目并尝试进一步滑动时,viewpager 滚动到下一页。我不希望这种情况发生。当我尝试过度滚动水平回收 View 时,我想禁用 viewpager 的分页。
但是,我不想在我在其他任何地方滑动时禁用 viewpager 的分页。例如,如果我要在垂直回收 View 或父 fragment 中的任何空白区域上滑动,它仍然会导致 viewpager 更改页面。
我读了in this SO question , 如何禁用 viewpager 的分页。还有 this SO question相似之处在于有一个子 viewpager,但是我没有成功尝试使用水平 recyclerview 复制它。
这是一些结构:
允许我禁用分页的自定义 viewpager(从上面的第一个 SO 链接获取):
public class CustomViewPager extends ViewPager {
private boolean enabled;
public CustomViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
this.enabled = true;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (this.enabled) {
return super.onTouchEvent(event);
}
return false;
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
if (this.enabled) {
return super.onInterceptTouchEvent(event);
}
return false;
}
public void setPagingEnabled(boolean enabled) {
this.enabled = enabled;
} }
对于水平回收 View ,我设置了一个 ontouchlistener(类似于上面的第二个 SO 链接):
horizontalRecyclerView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch(event.getAction()){
case MotionEvent.ACTION_MOVE:
customViewPager.setPagingEnabled(false);
break;
case MotionEvent.ACTION_UP:
customViewPager.setPagingEnabled(true);
break;
}
return false;
}
});
额外观察:我注意到,有时如果我在滑动之前长按水平回收器 View ,它不会转到 viewpager 的下一页。但是,如果我快速滑动,viewpager 将转到下一页。
有谁知道正确的方法吗?
感谢任何帮助。
最佳答案
这是解决方案。
requestDisallowInterceptTouchEvent()
此方法将不允许 parent 移动。它停止 viewpager 触摸事件。
horizontalRecyclerView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() {
@Override
public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
int action = e.getAction();
switch (action) {
case MotionEvent.ACTION_MOVE:
rv.getParent().requestDisallowInterceptTouchEvent(true);
break;
}
return false;
}
@Override
public void onTouchEvent(RecyclerView rv, MotionEvent e) {
}
@Override
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
}
});
关于android - 当子 recyclerview 滚动到最后一项时禁用 ViewPager 分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38466413/