【问题标题】:Horizontal RecyclerView inside ViewPager2 behaviorViewPager2 行为中的水平 RecyclerView
【发布时间】:2020-06-17 17:21:32
【问题描述】:

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

其中一个片段有2个RecyclerView,都是Horizo​​ntal Linear。

当您触摸 RecyclerView 时,ViewPager 会处理滑动手势,而不是滚动 RecyclerView。

RecyclerViews 和 ViewPager 都在 NestedScrollView 中,但这并没有改变任何东西。

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


如何让 RecyclerView 在被触摸时处理滚动,并在触摸在 RecyclerView 内部时禁用 ViewPager 的处理。


PS : 我知道大多数人会说不推荐,Google Play 商店有相同的视图,但 ViewPager 不可滚动,相反,用户应该使用 TabLayout 来导航页面。

【问题讨论】:

    标签: android android-recyclerview android-viewpager


    【解决方案1】:

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

     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 with horizontal scrollView inside

    【讨论】:

      猜你喜欢
      • 2020-12-02
      • 1970-01-01
      • 2019-01-20
      • 2020-06-04
      • 2016-08-15
      • 2016-01-20
      • 1970-01-01
      • 1970-01-01
      • 2017-08-29
      相关资源
      最近更新 更多