ViewPager 中的水平 RecyclerView 不滚动

Ris*_*876 4 android android-viewpager android-recyclerview android-nestedscrollview

我在复杂的层次结构中有一个水平 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>
Run Code Online (Sandbox Code Playgroud)

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

Ast*_*liu 10

您可以通过覆盖 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) {

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

  • 但它在与回收者视图交互时也会阻止屏幕的垂直移动。 (2认同)

Var*_*Raj 7

这个答案是 @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) {}
        })
Run Code Online (Sandbox Code Playgroud)


Sur*_*nav 1

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