recyclerView
でページ分割を実装したいので、addOnScrollListener
をrecyclerView
に追加しますが、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);
}
}
}
}
});
この質問は古いかもしれませんが、この問題に遭遇した他の人を助けるために、私がしたことを共有したいと思います。サーバーからデータを読み込み、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
}
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を設定します。
あなたはあなたの質問へのコメントで言った」
コーディネーターレイアウトの下にあるNestedScrollViewの下にあります。これを削除すると、ツールバーが上にスクロールしません。 "これは間違いです。
私はあなたがそれを両方の方法で持つことができないことを発見しました、あなたが振る舞いを追加したCoordinatorLayout
の中にRecyclerView
があるとNestedScrollView
の動作は壊れます。どちらかを使用する必要があります。
RecyclerView
の内部にNestedScrollView
がある場合、RecyclerView.setNestedScrollingEnabled(false)
を設定する限り機能しますが、これはOnScrollListener
が呼ばれていません。
すべてのコンポーネントが正しく機能する唯一の方法は、NestedScrollView
を削除し、ネスティングスクロールをfalseに設定しないでくださいであることを確認して、そこから作業することです。それ以外の場合、RecyclerView.OnScrollListener
イベントは正しく発生しません。
ネストされたスクロールビューを削除し、ルート要素としてではなく線形または相対レイアウトを使用して、recyclerview.setNestedScrollEnabled(false);を記述できます。
ステップ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
}
}
});
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;
}
}
}
});
}