web-dev-qa-db-ja.com

NestedScrollView内のRecyclerView ScrollListener

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
        }
    });

上記の場合のスクロールイベントを取得するにはどうすればよいですか?

スクロール可能な2つのビューを相互に配置するのは良くないことを知っています。しかし、2つのスクロール可能なビューを持たずに上記のケースをどのように持っていますか?

私はすでにこのリンクをたどっていますが、機能しません: scrollview Android内のrecyclerviewのスクロールイベント

21
Damia Fuentes

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

44
Govind

私は同様の問題を抱えていましたが、少し異なりました。私の場合、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でrecycleviewをラップすると、recycleviewのaddOnScrollListenerが通常どおり呼び出されることがわかります。

0
Anton Makov