Поведение прокрутки конфликтует с дочерним RecyclerView и родительским Viewpager2

У меня есть вертикальная прокрутка ViewPager2, а последние дочерние элементы содержат RecyclerView прокрутку в том же направлении.

Это вызывает противоречивое поведение, ViewPager2 всегда крадет событие прокрутки, когда я нахожусь на странице, содержащей этот RecyclerView. Единственный способ сделать прокрутку внутри RecyclerView — это если я прокручиваю очень медленно, если я делаю это быстро, как событие смахивания, ViewPager2 прокручивается и меняет страницу.

В настоящее время я делаю исправление, которое включает в себя отключение взаимодействия с пользователем, изменение флага isUserInputEnabled на false, когда страница ViewPager2 изменяется на эту страницу, содержащую RecyclerView, но общее решение из фреймворка приветствуется :)


person Victor Oliveira    schedule 16.10.2019    source источник
comment
Попробуйте поместить свой RecyclerView в <androidx.core.widget.NestedScrollView> NestedScrollView   -  person blaffie    schedule 16.10.2019
comment
^ Однако имейте в виду, что при этом ваш RecyclerView больше не может перерабатывать представления и будет прибегать к простому виджету, раздувающему все его содержимое сразу, поскольку он больше не имеет контроля над измерениями и должен делегировать это NestedScrollView, который ничего не знает о переработке представления.   -  person Martin Marconcini    schedule 16.10.2019


Ответы (2)


У меня была проблема, похожая на вашу, и я нашел ответ в официальной документации< /а>.

Я бы посоветовал НЕ помещать ваш RecyclerView в NestedScrollView просто по причине, по которой Мартин Макрончини ответил ранее. Это приводит к тому, что RecyclerView создает ViewHolder для каждого отдельного элемента данных, независимо от их повторного использования. Очевидно, что это очень неэффективно.

Вместо этого Google предоставил решение в своих примерах ViewPager2, где они создали универсальный класс-оболочка с именем NestedScrollableHost, который вы просто добавляете в свой проект. Затем вы можете обернуть этот RecyclerView, как показано ниже, для обработки перехваченных событий касания/перелистывания:

<NestedScrollableHost
            android:layout_width="match_parent"
            android:layout_height="match_parent">

        <androidx.recyclerview.widget.RecyclerView
                android:id="@+id/my_recycler_view"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="vertical" />

    </NestedScrollableHost>

Как указано в документации, это работает только для непосредственных дочерних элементов ViewPager2, что в вашем случае должно работать нормально.

Надеюсь, это поможет!

person Calvin Rai    schedule 11.03.2020
comment
кто-нибудь может предоставить java-версию класса NestedScrollableHost? - person Ali Zarei; 04.04.2020
comment
@AliZarei Я сделал Java-версию, вы можете найти ее здесь - person Khaled; 12.04.2020
comment
Будущим читателям: не используйте приведенную выше версию Java, она отличается от версии Kotlin и не работает должным образом на старых устройствах. Сохранить себя. - person Bitwise DEVS; 19.05.2021

Поместите свой recyclerview внутри NestedScrollView и установите свойство ниже для recyclerview и

android:nestedScrollingEnabled="false"

Попробуйте это или управляйте сенсорным событием на recyclerview

person vijay_s30    schedule 16.10.2019