RecyclerView ScrollListener внутри NestedScrollView

У меня есть EndlessRecyclerView в конце NestedScrollView. EndlessRecyclerView означает: когда пользователь прокручивается до нижней части recyclerView, он загружает больше данных. Это уже реализовано и работает в другом месте, но когда я помещаю recyclerView внутри NestedScrollView, события OnScrollListener не срабатывают.

XML-дизайн:

<NestedScrollView>

     <Other views/>

     <EndlessRecyclerView/>

</NestedScrollView >

код:

recyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);
            // This is never fired! Here is where I implement the logic of EndlessRecyclerView
        }
    });

Как мне получить событие прокрутки для вышеуказанного случая?

Я знаю, что нехорошо иметь два прокручиваемых вида внутри друг друга. Но, как я могу иметь вышеуказанный случай без двух прокручиваемых представлений?

Я уже следил за этой ссылкой, но она не работает: прокрутить событие для recyclerview внутри scrollview android

Ответ 1

Чтобы достичь бесконечной прокрутки для просмотра recycler, находящегося под NestedScrollView, вы можете использовать "NestedScrollView.OnScrollChangeListener"

nestedScrollView.setOnScrollChangeListener((NestedScrollView.OnScrollChangeListener) (v, scrollX, scrollY, oldScrollX, oldScrollY) -> {
            if(v.getChildAt(v.getChildCount() - 1) != null) {
                if ((scrollY >= (v.getChildAt(v.getChildCount() - 1).getMeasuredHeight() - v.getMeasuredHeight())) &&
                        scrollY > oldScrollY) {
                        //code to fetch more data for endless scrolling
                }
            }
        });

Здесь v.getChildCount() -1 должен предоставить вам вид ресайклера, для которого вы выполняете бесконечную прокрутку.

Также scrollY > oldScrollY подтверждает, что страница прокручивается вниз.

Ссылка: NestedScrollView.OnScrollChangeListener

Ответ 2

У меня была похожая проблема, хотя она была немного другой. В моем случае у меня был повторный просмотр внутри фрагмента, в то время как NestedScrollView находился в файле content_main xml (часть упражнения).

Я завернул свой recycleview, который был внутри фрагмента, с помощью SwipeRefreshLayout

Это код моего фрагмента:

    <?xml version="1.0" encoding="utf-8"?>
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
    android:id="@+id/swipe_dummy"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

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

</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>

Осталось только отключить SwipeRefreshLayout из кода

mSwipeLayout.isEnabled = false

Если вы этого не сделаете, то, когда вы проведете пальцем вниз, появится значок бесконечного обновления. Я хотел бы поделиться этим решением на тот случай, если кому-то понадобится эта функциональность или возникнет эта проблема.

После того, как вы оберните повторное представление с помощью SwipeRefreshLayout, вы увидите, что addOnScrollListener повторного просмотра будет вызываться как обычно