Горизонтальный RecyclerView внутри ViewPager не прокручивается

У меня есть горизонтальный 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 перехватывает прокрутку у Horizontal RV. В этом вертикальном RV есть 2 типа горизонтального RV (RV1 и RV2). Но только один из них (RV1) сталкивается с этой проблемой. Второй (RV2) работает исправно. Также, когда я нажимаю и удерживаю, прокрутка работает нормально. А когда RV1 уже скроллит и не засел, то и скролл работает нормально. Я сослался на другие ответы, говорящие об установке вложенного прокрутки false. Кажется, ничего не работает.


person Rishabh876    schedule 19.01.2019    source источник


Ответы (3)


Вы можете добиться этого, переопределив метод 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) {

            }
        });
person Astrit Veliu    schedule 23.01.2020

Этот ответ является kotlin-версией ответа @Astril Veliy.

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) {}
        })
person OhhhThatVarun    schedule 08.03.2020

Представление пейджера и горизонтального ресайклера могут прокручиваться горизонтально, поэтому ОС стало трудно определить, какой из них прокручивать. Поэтому вам нужно использовать ViewPager без перелистывания вместо второго ViewPager, проверьте этот ответ, чтобы узнать, как использовать неперемещаемый ViewPager.

person Suraj Vaishnav    schedule 19.01.2019
comment
Это полностью отключит viewpager. А я этого не хочу. - person Rishabh876; 19.01.2019
comment
Нет, вы можете переключить вкладку, нажав на вкладку напрямую. - person Suraj Vaishnav; 19.01.2019
comment
Я имел в виду, что мне нужны жесты для работы. Он работает на RV2, но не на RV1. Поэтому я хочу знать, что мне здесь не хватает. - person Rishabh876; 19.01.2019