android - 当子 recyclerview 滚动到最后一项时禁用 ViewPager 分页

标签 android android-fragments android-viewpager android-recyclerview

我有一个 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/

相关文章:

android - 我有一个包含多个 ListView 的 ViewPager,我在哪里监听被单击的项目?

android - MediaPlayer 在 Android 上启动和停止

java - Android - 如何以编程方式使我的应用程序默认短信应用程序

java - Android 函数转AsyncTask

android - Firebase 是否有用于下载 Firebase 存储中的视频的库?

java - 无法从 Activity 访问 fragment 方法

android - 在带有 fragment 的 Activity 中为 ListView 设置适配器时出现 Nullpointerexception

java - 定位器不适用于 Android 6.0 +

android - 为 ViewPager 实现 onClickListener

android - 为多个选项卡返回相同的 fragment