Je veux implémenter la pagination avec recyclerView
, pour cela j'ajoute addOnScrollListener
à la recyclerView
mais j'ai des problèmes avec RecyclerView.OnScrollListener
qui ne fonctionne pas lorsque je règle rvGridExplore.setNestedScrollingEnabled(false);
Mais lorsque je supprime rvGridExplore.setNestedScrollingEnabled(false);
, cela fonctionne bien, Je ne sais pas comment gérer cela.
Voici le code:
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);
}
}
}
}
});
Cette question est peut-être ancienne, mais pour aider les autres qui sont tombés sur ce problème, j'aimerais partager ce que j'ai fait. J'ai dû implémenter onScroll Listener avec recyclerview
pour charger des données à partir du serveur et apporter des modifications à l'interface utilisateur. Et également besoin de swipeRefresh Layout pour actualiser les données.
C'était ma structure de fichier xml,
-RelativeLayout
-SwipeRefreshLayout
-NestedScrollView
-LinearLayout(Vertical)
-Multiple views required
Ensuite, pour détecter le défilement ascendant et descendant, j’implémentais setOnScrollListener dans NestedScrollView.
Utilisation normale de SwipeRefreshLayout pour actualiser les données.
Et pour charger plus de données, j'ai implémenté la logique dans onScrollListener de NestedScrollingView.
if (scrollY == (v.getChildAt(0).getMeasuredHeight() - v.getMeasuredHeight())) {
// Load More Data
}
supprimez la vue de défilement imbriquée, utilisez une disposition linéaire ou relative à la place de celle-ci en tant qu'élément racine; vous pouvez alors écrire recyclerview.setNestedScrollEnabled (false);
Étape 1: créez 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();
}
Étape 2: appliquez un écouteur de défilement à la vue du recycleur.
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
}
}
});
Vous avez dit dans un commentaire à votre question "
il est sous NestedScrollView qui est sous la disposition du coordinateur, si je supprime ceci, la barre d’outils ne défile pas ". C’est une erreur.
J'ai constaté que vous ne pouvez pas avoir les deux manières, le comportement CoordinatorLayout
s'interrompt lorsque vous avez une variable RecyclerView
dans une variable NestedScrollView
à laquelle vous avez ajouté le comportement. Vous devez utiliser l'un ou l'autre.
Lorsque vous avez une RecyclerView
dans une NestedScrollView
, cela fonctionnera tant que vous définissez RecyclerView.setNestedScrollingEnabled(false)
, mais comme vous l'avez découvert, cela signifie que la OnScrollListener
n'est pas appelée.
Pour que tous les composants fonctionnent correctement, le seul moyen consiste à supprimer la variable NestedScrollView
et à vous assurer que ne définissez pas le défilement imbriqué sur false et que vous travailliez à partir de là. Sinon, les événements RecyclerView.OnScrollListener
ne se déclencheront pas correctement.
Ne ajoutez setOnScrollChangeListner à votre NestedScrollView
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;
}
}
});
après le chargement des données du serveur, définissez boolean loading = true.