【问题标题】:Horizontal RecyclerView inside ViewPager is not scrollingViewPager 内的水平 RecyclerView 不滚动
【发布时间】:2019-01-19 17:56:04
【问题描述】:

我在复杂层次结构中有一个水平 RecyclerView,看起来像这样 -

<ViewPager id="+@id/first">
    <ViewPager id="+@id/second"> this viewpager is taking away the scroll event
        <SwipeToRefreshLayout>
            <RecyclerView> //this one is vertical
                <RecyclerView id="@id/rv1"> //this one is horizontal
                <RecyclerView id="@id/rv2"> //this one is working fine (different type)
            </RecyclerView>
        </SwipeToRefreshLayout>
    </ViewPager>
</ViewPager>

现在的问题是第二个 ViewPager 正在劫持 Horizo​​ntal RV 的滚动。该垂直房车中有 2 种水平房车(RV1 和 RV2)。但只有其中一个(RV1)面临这个问题。第二个(RV2)工作正常。 此外,当我按住时,滚动工作正常。当 RV1 已经在滚动并且没有稳定下来时,滚动也可以正常工作。 我已经提到了其他关于将nestedScrolling设置为false的答案。似乎没有任何效果。

【问题讨论】:

    标签: android android-recyclerview android-viewpager android-nestedscrollview


    【解决方案1】:

    您可以通过重写 onInterceptTouchEvent 方法来实现:

     mRecyclerView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() {
                @Override
                public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent event) {
                    int action = event.getAction();
                   
                    switch (action) {
                        case MotionEvent.ACTION_DOWN:
                            rv.getParent().requestDisallowInterceptTouchEvent(true);
    
                            break;
                    
                    }
                    return false;
                }
    
                @Override
                public void onTouchEvent(@NonNull RecyclerView view, @NonNull MotionEvent event) {
    
                }
    
                @Override
                public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
    
                }
            });
    

    【讨论】:

    • 但它在与 recycler-view 交互时也会阻止屏幕的垂直移动。
    【解决方案2】:

    这个答案是 @Astril Veliu 的答案的 Kotlin 版本

    yourRecyclerView.addOnItemTouchListener(object : RecyclerView.OnItemTouchListener {
                
                override fun onTouchEvent(view: RecyclerView, event: MotionEvent) {}
                
                override fun onInterceptTouchEvent(view: RecyclerView, event: MotionEvent): Boolean {
                    when (event.action) {
                        MotionEvent.ACTION_DOWN -> {
                            yourRecyclerView.parent?.requestDisallowInterceptTouchEvent(true)
                        }
                    }
                    return false
                }
                
                override fun onRequestDisallowInterceptTouchEvent(disallowIntercept: Boolean) {}
            })
    

    【讨论】:

      【解决方案3】:

      视图分页器和水平回收器视图都可以水平滚动,因此操作系统很难找到要滚动的视图。因此,您需要使用不可滑动的 ViewPager 代替您的第二个 ViewPager,查看this 答案以了解如何使用不可滑动的 ViewPager。

      【讨论】:

      • 这将完全禁用查看器。我不想那样。
      • 不,你可以通过直接点击标签来切换标签。
      • 我的意思是我需要手势才能工作。它适用于 RV2,但不适用于 RV1。所以我想知道我在这里错过了什么。
      【解决方案4】:

      如果您不想在滚动到末尾后更改 ViewPager 片段,可以使用OhhhThatVarun's answer

      如果要在滚动到末尾后更改 ViewPager 片段:

      recyclerView.addOnItemTouchListener(object : RecyclerView.OnItemTouchListener {
      
          override fun onInterceptTouchEvent(rv: RecyclerView, e: MotionEvent): Boolean {
              val action = e.action
              if (recyclerView.canScrollHorizontally(RecyclerView.FOCUS_FORWARD) || binding.photos.canScrollHorizontally(-RecyclerView.FOCUS_FORWARD)) {
                  when (action) {
                     MotionEvent.ACTION_MOVE -> rv.parent
                              .requestDisallowInterceptTouchEvent(true)
                  }
                  return false
              }
              else {
                  when (action) {
                      MotionEvent.ACTION_MOVE -> rv.parent
                              .requestDisallowInterceptTouchEvent(false)
                  }
                  recyclerView.removeOnItemTouchListener(this)
                  return true
              }
          }
      
          override fun onTouchEvent(rv: RecyclerView, e: MotionEvent) {}
          override fun onRequestDisallowInterceptTouchEvent(disallowIntercept: Boolean) {}
      })
      

      【讨论】:

        猜你喜欢
        • 2017-05-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多