提问者:小点点

水平RecyclView内部ViewPager2行为


我有一个ViewPager2,里面有片段。

其中一个片段有2个RecyclerViews,这两个视图都是水平线性的。

当您触摸回收站视图时,视图寻呼机会处理滑动手势,并且不会滚动回收站视图。

RecyclerViews和ViewPenger都在NestedScrollView中,但这不会改变任何事情。

滚动回收站视图的唯一方法是在回收站视图上做一个缓慢的滑动手势,这样,回收站视图处理滑动手势而不是视图,但当然,这对用户来说不方便。

如何使回收器视图在触摸时处理滚动,并在触摸在回收器视图内时禁用视图寻呼机的处理。

P. S:我知道大多数人会说不推荐,谷歌应用商店有相同的视图,但是ViewPenger不可滚动,相反,用户应该使用TabLayout来导航页面。


共3个答案

匿名用户

这是我为我的案例定义的,可以动态应用于ViewPage2中的任何回收器视图

 public void controlHorizontalScrollingInViewPager2(RecyclerView recyclerView, ViewPager2 viewPager2) {
    RecyclerView.OnItemTouchListener onTouchListener = new RecyclerView.OnItemTouchListener() {
        int lastX = 0;

        @Override
        public boolean onInterceptTouchEvent(@NonNull RecyclerView rv, @NonNull MotionEvent e) {
            switch (e.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    lastX = (int) e.getX();
                    break;
                case MotionEvent.ACTION_MOVE:
                    boolean isScrollingRight = e.getX() < lastX;
                    if ((isScrollingRight && ((LinearLayoutManager) recyclerView.getLayoutManager()).findLastCompletelyVisibleItemPosition() == recyclerView.getAdapter().getItemCount() - 1) ||(!isScrollingRight && ((LinearLayoutManager) recyclerView.getLayoutManager()).findFirstCompletelyVisibleItemPosition() == 0)) {
                        viewPager2.setUserInputEnabled(true);
                    } else {
                        viewPager2.setUserInputEnabled(false);
                    }
                    break;
                case MotionEvent.ACTION_UP:
                    lastX = 0;
                    viewPager2.setUserInputEnabled(true);
                    break;
            }
            return false;
        }

        @Override
        public void onTouchEvent(@NonNull RecyclerView rv, @NonNull MotionEvent e) {
        }

        @Override
        public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
        }
    };
    recyclerView.addOnItemTouchListener(onTouchListener);
}

用法:

controlHorizontalScrollingInViewPager2(yourRecyclerView,mViewPager2);

查看此处报告的类似问题ViewPager2,其中包含水平滚动视图

匿名用户

我在所有可能的网站上搜索了很长时间来寻找这个问题的解决方案,但我不得不尝试并编写自己的代码。
请在下面尝试kotlin

recyclerView.addOnItemTouchListener(object : RecyclerView.OnItemTouchListener {
    override fun onInterceptTouchEvent(rv: RecyclerView, e: MotionEvent): Boolean {

        when (e.action) {
            MotionEvent.ACTION_MOVE -> viewPager2!!.isUserInputEnabled = false
            else -> viewPager2!!.isUserInputEnabled = true
        }
        return false
    }

    override fun onTouchEvent(rv: RecyclerView, e: MotionEvent) {
        TODO("Not yet implemented")
    }

    override fun onRequestDisallowInterceptTouchEvent(disallowIntercept: Boolean) {
        TODO("Not yet implemented")
    }

匿名用户

fun ViewPager2.reduceDragSensitivity() {
    val recyclerViewField = ViewPager2::class.java.getDeclaredField("mRecyclerView")
    recyclerViewField.isAccessible = true
    val recyclerView = recyclerViewField.get(this) as RecyclerView

    val touchSlopField = RecyclerView::class.java.getDeclaredField("mTouchSlop")
    touchSlopField.isAccessible = true
    val touchSlop = touchSlopField.get(recyclerView) as Int

    touchSlopField.set(recyclerView, touchSlop*8)       // "8" was obtained experimentally
}

上述代码会降低< code > view page 2 的敏感度。以下是文章来源:https://al-e-shevelev . medium . com/how-to-reduce-scroll-sensitivity-of-view page 2-widget-87797 ad 02414