Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android ViewPager内的水平循环视图未滚动_Android_Android Recyclerview_Android Viewpager_Android Nestedscrollview - Fatal编程技术网

Android ViewPager内的水平循环视图未滚动

Android ViewPager内的水平循环视图未滚动,android,android-recyclerview,android-viewpager,android-nestedscrollview,Android,Android Recyclerview,Android Viewpager,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,如下所示-

<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正在删除滚动事件
//这个是垂直的
//这个是水平的
//这个很好用(不同类型)
现在的问题是,第二个ViewPager正在劫持水平RV的滚动条。该垂直RV中有两种类型的水平RV(RV1和RV2)。但其中只有一家(RV1)面临这一问题。第二个(RV2)工作正常。 当我按住时,滚动也可以正常工作。当RV1已经在滚动并且没有稳定下来时,滚动也可以正常工作。 我提到了其他关于将nestedScrolling设置为false的答案。似乎什么都没用


查看寻呼机和水平回收器视图都可以水平滚动,因此操作系统很难确定要滚动哪一个。所以,您需要使用不可切换的ViewPager来代替第二个ViewPager,请查看如何使用不可切换的ViewPager的答案

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

 mRecyclerView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() {
            @Override
            public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
                int action = e.getAction();

                switch (action) {
                    case MotionEvent.ACTION_DOWN:
                        rv.getParent().requestDisallowInterceptTouchEvent(true);

                        break;

                }
                return false;
            }

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

            }

            @Override
            public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {

            }
        });

这个答案是@Astril Veliy答案的kotlin版本

yourRecyclerView.addOnItemTouchListener(object : RecyclerView.OnItemTouchListener {

            override fun onTouchEvent(rv: RecyclerView, e: MotionEvent) {}

            override fun onInterceptTouchEvent(rv: RecyclerView, e: MotionEvent): Boolean {
                when (e.action) {
                    MotionEvent.ACTION_DOWN -> {
                        yourRecyclerView.parent?.requestDisallowInterceptTouchEvent(true)
                    }
                }
                return false
            }

            override fun onRequestDisallowInterceptTouchEvent(disallowIntercept: Boolean) {}
        })

这将完全禁用viewpager。我不想这样。不,你可以通过直接点击标签来切换标签。我的意思是我需要这些手势来工作。它在RV2上工作,但在RV1上不工作。所以我想知道我错过了什么。