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 повторного просмотра будет вызываться как обычно