当子recyclelerview滚动到最后一个项目时,禁用ViewPager分页

Arc*_*cos 9 android android-fragments android-viewpager android-recyclerview

我有一个viewpager,在其中一个片段中,我有两个独立的片段,分别包含一个垂直和水平的Recyclerview.

当我将水平回收视图滚动到最后一项并尝试进一步滑动时,viewpager会滚动到下一页.我不希望这种情况发生.当我尝试过度滚动水平回收视图时,我想禁用viewpager的分页.

但是,当我在其他地方滑动时,我不想禁用viewpager的分页.例如,如果我要在垂直的recyclelerview或父片段中的任何空白区域上滑动,它仍然会导致viewpager更改页面.

在这个问题中读到如何禁用viewpager的分页.同时这太问题是,有一个孩子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;
} }
Run Code Online (Sandbox Code Playgroud)

对于水平回收视图,我设置了一个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;
                }
            });
Run Code Online (Sandbox Code Playgroud)

额外的观察:我注意到有时如果我在滑动之前长按水平回收视图,它将不会进入viewpager的下一页.但是,如果我快速滑动,viewpager将转到下一页.

有谁知道这样做的正确方法?

任何帮助表示赞赏.

Sha*_*got 22

这是解决方案.

requestDisallowInterceptTouchEvent()
Run Code Online (Sandbox Code Playgroud)

此方法不允许父移动.它停止了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) {

        }
    });
Run Code Online (Sandbox Code Playgroud)