web-dev-qa-db-ja.com

setNestedScrollingEnabledをfalseに設定するとRecyclerview onscrolllistenerが機能しない

recyclerViewでページ分割を実装したいので、addOnScrollListenerrecyclerViewに追加しますが、rvGridExplore.setNestedScrollingEnabled(false);を設定するとRecyclerView.OnScrollListenerが機能しないので問題があります

しかし、rvGridExplore.setNestedScrollingEnabled(false);を削除すると、正常に機能しますが、これを処理する方法がわかりません。

ここにコードがあります:

rvGridExplore = (RecyclerView) view.findViewById(R.id.rvGridExplore);
        final GridLayoutManager glm = new GridLayoutManager(context,2);
       // rvGridExplore.setNestedScrollingEnabled(false);
        rvGridExplore.setLayoutManager(glm);

       // final int visibleItemCount,totalCount,pastVisibleItems;
        rvGridExplore.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
                Log.v("scrollll","state changed");
            }

            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
                if (dy > 0) {
                    int totalCount = glm.getItemCount();
                    int visibleItemCount = glm.getChildCount();
                    int pastVisibleItems = glm.findFirstVisibleItemPosition();
                    if (loading) {
                        if ((visibleItemCount + pastVisibleItems) >= totalCount) {
                            Log.v("scroll","scrolled"+pastVisibleItems);
                        }
                    }

                }
            }
        });
11
Adnan Ali

この質問は古いかもしれませんが、この問題に遭遇した他の人を助けるために、私がしたことを共有したいと思います。サーバーからデータを読み込み、UIを変更するために、onScroll Listenerをrecyclerviewに実装する必要がありました。また、データを更新するためにswipeRefreshレイアウトも必要でした。

これは私のxmlファイル構造でした。

-RelativeLayout

 -SwipeRefreshLayout

  -NestedScrollView

   -LinearLayout(Vertical)

    -Multiple views required

この後、上下スクロールを検出するために、NestedScrollViewにsetOnScrollListenerを実装しました。

データを更新するためのSwipeRefreshLayoutの通常の使用法。

さらに多くのデータを読み込むために、NestedScrollingViewのonScrollListener内にロジックを実装しました。

if (scrollY == (v.getChildAt(0).getMeasuredHeight() - v.getMeasuredHeight()))  {

    // Load More Data
}
5
m.n Aswin

NestedScrollViewにsetOnScrollChangeListnerを追加してください

 nestedScrollview.setOnScrollChangeListener(new NestedScrollView.OnScrollChangeListener() {
        @Override
        public void onScrollChange(NestedScrollView v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
            if (scrollY == (v.getChildAt(0).getMeasuredHeight() - v.getMeasuredHeight()))  {
               if(loading)
                onClick();
               loading=false;
            }
        }
    });

サーバーからデータをロードした後、boolean loading = trueを設定します。

2
Harish Reddy

あなたはあなたの質問へのコメントで言った」
コーディネーターレイアウトの下にあるNestedScrollViewの下にあります。これを削除すると、ツールバーが上にスクロールしません。 "これは間違いです

私はあなたがそれを両方の方法で持つことができないことを発見しました、あなたが振る舞いを追加したCoordinatorLayoutの中にRecyclerViewがあるとNestedScrollViewの動作は壊れます。どちらかを使用する必要があります。

RecyclerViewの内部にNestedScrollViewがある場合、RecyclerView.setNestedScrollingEnabled(false)を設定する限り機能しますが、これはOnScrollListenerが呼ばれていません。

すべてのコンポーネントが正しく機能する唯一の方法は、NestedScrollViewを削除し、ネスティングスクロールをfalseに設定しないでくださいであることを確認して、そこから作業することです。それ以外の場合、RecyclerView.OnScrollListenerイベントは正しく発生しません。

1
r3flss ExlUtr

ネストされたスクロールビューを削除し、ルート要素としてではなく線形または相対レイアウトを使用して、recyclerview.setNestedScrollEnabled(false);を記述できます。

0
faisal waris

ステップ1:EndlessRecyclerOnScrollListenerを作成する

public abstract class EndlessRecyclerOnScrollListener extends RecyclerView.OnScrollListener {

    public static String TAG = EndlessRecyclerOnScrollListener.class.getSimpleName();

    // use your LayoutManager instead
    private LinearLayoutManager llm;

    public EndlessRecyclerOnScrollListener(LinearLayoutManager sglm) {
        this.llm = llm;
    }

    @Override
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
        super.onScrolled(recyclerView, dx, dy);

        if (!recyclerView.canScrollVertically(1)) {
            onScrolledToEnd();
        }
    }

    public abstract void onScrolledToEnd();
}

ステップ2:スクロールリスナーをリサイクラービューに適用します。

recyclerview.addOnScrollListener(new EndlessRecyclerOnScrollListener(mLayoutManager) {
            @Override
            public void onScrolledToEnd() {
                Log.e("Position", "Last item reached");
                if (loadMore == true) {
                    // put your Load more code
                    // add 10 by 10 to tempList then notify changing in data
                }
            }
        });
0

RecyclerViewがNestedScrollViewのいずれかに埋め込まれている場合は、onScrollListenerをNestedScrollViewにアタッチする必要があります。

これでうまくいきます!

if (recyclerView.getLayoutManager() instanceof GridLayoutManager) {
    final GridLayoutManager gridLayoutManager = (GridLayoutManager) recyclerView.getLayoutManager();
    nestedScrollView.setOnScrollChangeListener(new NestedScrollView.OnScrollChangeListener() {
        @Override
        public void onScrollChange(NestedScrollView v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
            if (scrollY == (v.getChildAt(0).getMeasuredHeight() - v.getMeasuredHeight()))  {
                totalItemCount = gridLayoutManager.getItemCount();
                lastVisibleItem = gridLayoutManager.findLastVisibleItemPosition();
                if (!loading
                        && totalItemCount <= (lastVisibleItem + visibleThreshold)) {
                    // End has been reached
                    // Do something
                    if (onLoadMoreListener != null) {
                        onLoadMoreListener.onLoadMore();
                    }
                    loading = true;
                }
            }
        }
    });
}
0
Sreekant Shenoy