Je voudrais changer ListView
pour RecyclerView
. Je veux utiliser onScroll
leOnScrollListener
dans RecyclerView
pour déterminer si un utilisateur défilée à la fin de la liste.
Comment savoir si un utilisateur défile jusqu'à la fin de la liste afin que je puisse récupérer de nouvelles données à partir d'un service REST?
cwac-endless
forListView
.Réponses:
Merci à @Kushal et c'est ainsi que je l'ai implémenté
N'oubliez pas d'ajouter
la source
StaggeredGridLayoutManager
mLayoutManager.findLastCompletelyVisibleItemPosition()==mLayoutManager.getItemCount()-1
findFirstVisibleItemPosition()
n'ont pas résolu, vous devriez changerRecyclerView.LayoutManager
pourLinearLayoutManager
loading = true
refaire?loading = true
après la//Do pagination
partie. sinon ce code ne s'exécutera qu'une seule fois et vous ne pourrez pas charger plus d'élément.Faites ces variables.
Activez le défilement pour afficher le recycleur.
et pour une grille
Amusez-vous avec vos parchemins sans fin !! ^. ^
Depuis Android prend désormais officiellement en charge Kotlin, voici une mise à jour pour le même -
Faire OnScrollListener
et l'ajouter à votre RecyclerView comme ceci
Pour un exemple de code complet, n'hésitez pas à consulter ce dépôt Github .
la source
findFirstVisibleItemPosition()
méthode n'est disponible qu'avec LinearLayoutManager, je ne peux pas comprendre comment la faire fonctionner.visibleItemCount = mLayoutManager.getChildCount();
se comporte de la même manière que l'utilisationvisibleItemCount = mRecyclerView.getChildCount();
.int[] firstVisibleItemPositions = new int[yourNumberOfColumns]; pastVisiblesItems = layoutManager.findFirstVisibleItemPositions(firstVisibleItemPositions)[0];
Pour ceux qui ne veulent être avertis que lorsque le dernier élément est totalement affiché, vous pouvez utiliser
View.canScrollVertically()
.Voici ma mise en œuvre:
Remarque: Vous pouvez utiliser
recyclerView.getLayoutManager().canScrollVertically()
si vous souhaitez prendre en charge l'API <14.la source
RecyclerView
vous aurez de la chance à nouveau, car vous pouvez simplement faire une copie statique deView.canScrollVertically()
puisque les méthodes associées sont marquées publiques au lieu d'être protégées dansRecyclerView
. Vous pouvez également étendreRecyclerView
pour réimplémentercanScrollVertically()
si vous le souhaitez. Un troisième moyen simple consiste à appelerrecyclerView.getLayoutManager().canScrollVertically()
. Modifié dans ma réponse.Voici une autre approche. Cela fonctionnera avec n'importe quel gestionnaire de mise en page.
Pour une compréhension détaillée, j'ai écrit un article de blog et un exemple de projet. Téléchargez-le ici http://sab99r.com/blog/recyclerview-endless-load-more/
MyAdapter.java
MyActivity.java
la source
Ma réponse est une version modifiée de Noor. Je suis passé d'un
ListView
endroit où j'avaisEndlessScrollListener
(que vous pouvez trouver facilement dans de nombreuses réponses sur SO) à unRecyclerView
donc je voulais un mettreEndlessRecyclScrollListener
à jour facilement mon ancien auditeur.Voici donc le code, j'espère qu'il vous aidera:
la source
Pour moi, c'est très simple:
Soyez prudent avec les travaux asynchrones: le chargement du mL doit être modifié à la fin des travaux asynchrones. J'espère que ce sera utile!
la source
La plupart des réponses supposent que les
RecyclerView
utilisations aLinearLayoutManager
, ouGridLayoutManager
, ou mêmeStaggeredGridLayoutManager
, ou supposent que le défilement est vertical ou horyzontal, mais personne n'a posté une réponse complètement générique .L'utilisation de l'
ViewHolder
adaptateur n'est clairement pas une bonne solution. Un adaptateur peut avoir plus de 1RecyclerView
utilisateur. Il "adapte" leur contenu. Ce doit être la vue Recycleur (qui est la seule classe qui est responsable de ce qui est actuellement affiché pour l'utilisateur, et non l'adaptateur qui n'est responsable que de fournir du contenu àRecyclerView
) qui doit informer votre système que plus d'éléments sont nécessaires (pour charge).Voici ma solution, en utilisant rien d'autre que les classes abstraites de RecyclerView (RecycerView.LayoutManager et RecycerView.Adapter):
la source
LayoutManagers
mais un seul instant: déplacez votre code de calcul dans une autre méthode scrollListener - déplacez-le à laonScrollStateChanged
placeonScrolled
. Et pouronScrollStateChanged
vérifier:if(newState == RecyclerView.SCROLL_STATE_IDLE) { // calculation code }
Bien que la réponse acceptée fonctionne parfaitement, la solution ci-dessous utilise addOnScrollListener car setOnScrollListener est obsolète et réduit le nombre de variables et les conditions if.
la source
Bien qu'il y ait tant de réponses à la question, je voudrais partager notre expérience de la création de la vue de liste sans fin. Nous avons récemment implémenté un carrousel LayoutManager personnalisé qui peut fonctionner dans le cycle en faisant défiler la liste à l'infini ainsi que jusqu'à un certain point. Voici une description détaillée de GitHub .
Je vous suggère de jeter un œil à cet article avec des recommandations courtes mais utiles sur la création de LayoutManagers personnalisés: http://cases.azoft.com/create-custom-layoutmanager-android/
la source
Grâce à la puissance des fonctions d'extension de Kotlin, le code peut paraître beaucoup plus élégant. Mettez cela où vous voulez (je l'ai dans un fichier ExtensionFunctions.kt):
Et puis utilisez-le comme ceci:
Cette solution est basée sur la réponse de Kushal Sharma. Cependant, c'est un peu mieux car:
onScrollStateChanged
au lieu deonScroll
. C'est mieux car ilonScroll
est appelé à chaque fois qu'il y a une sorte de mouvement dans le RecyclerView, alors qu'ilonScrollStateChanged
n'est appelé que lorsque l'état du RecyclerView est modifié. En utilisantonScrollStateChanged
permettra d'économiser du temps CPU et, par conséquent, de la batterie.la source
SwipeRefreshLayout's setOnRefreshListener the addOnScrolledToEnd is not working
tiré la classe interne privée PullToRefresh: SwipeRefreshLayout.OnRefreshListener {override fun onRefresh () {pbViewMore !!. Visibilité = View.GONE pageCount = 0 courseList.clear () // appel asynctask here srlNoMessageRefreshLayout !!. IsRefreshing = false swipe ! .isRefreshing = false}}Voici comment je le fais, simple et court:
la source
OK, je l'ai fait en utilisant la méthode onBindViewHolder de RecyclerView.Adapter.
Adaptateur:
Fragment (ou activité) :
la source
onBindViewHolder()
, cela fonctionne comme un charme. L'implémentation est minuscule par rapport à l'écouteur de défilement et elle est plus facile à utiliser.Ma façon de détecter un événement de chargement n'est pas de détecter le défilement, mais d'écouter si la dernière vue était attachée. Si la dernière vue était jointe, je considère que c'est le moment de charger plus de contenu.
la source
J'essaierais d'étendre la méthode utilisée
LayoutManager
(par exempleLinearLayoutManager
) et de remplacerscrollVerticallyBy()
. Tout d'abord, j'appellerais d'super
abord, puis vérifierais la valeur entière retournée. Si la valeur est égale à,0
une bordure inférieure ou supérieure est atteinte. Ensuite, j'utiliserais unefindLastVisibleItemPosition()
méthode pour savoir quelle frontière est atteinte et charger plus de données si nécessaire. Juste une idée.De plus, vous pouvez même renvoyer votre valeur à partir de cette méthode permettant un défilement excessif et montrant un indicateur de "chargement".
la source
la source
onScrollStateChanged()
ne fonctionnera pas car il ne sera appelé que lorsque vous modifiez l'état du défilement et non pendant le défilement. Vous devez utiliser laonScrolled()
méthode.J'ai réalisé une implémentation de type défilement infini en utilisant cette logique dans la
onBindViewHolder
méthode de maRecyclerView.Adapter
classe.Avec ce code, lorsque RecyclerView atteint le dernier élément, il incrémente la page en cours et les rappels sur une interface qui est chargée de charger plus de données à partir de l'API et d'ajouter les nouveaux résultats à l'adaptateur.
Je peux poster un exemple plus complet si ce n'est pas clair?
la source
Pour les personnes qui utilisent StaggeredGridLayoutManager voici mon implémentation, cela fonctionne pour moi.
la source
Il existe une bibliothèque facile à utiliser pour cette pagination nommée . Prend en charge ListView et RecyclerView (LinearLayout, GridLayout et StaggeredGridLayout).
Voici le lien vers le projet sur Github
la source
Créez une classe abstraite et étend RecyclerView.OnScrollListener
en activité (ou fragment) ajouter addOnScrollListener à recyclerView
la source
J'ai un exemple assez détaillé de la pagination avec un RecyclerView. À un niveau élevé, j'ai un ensemble PAGE_SIZE, disons 30. Donc je demande 30 articles et si j'en récupère 30, je demande la page suivante. Si je reçois moins de 30 éléments, je signale une variable pour indiquer que la dernière page a été atteinte, puis j'arrête de demander plus de pages. Vérifiez-le et faites-moi savoir ce que vous en pensez.
https://medium.com/@etiennelawlor/pagination-with-recyclerview-1cb7e66a502b
la source
Ici, ma solution utilisant AsyncListUtil , sur le Web, dit: Notez que cette classe utilise un seul thread pour charger les données, donc elle convient pour charger des données à partir d'un stockage secondaire tel qu'un disque, mais pas à partir d'un réseau. mais j'utilise odata pour lire les données et travailler correctement. Je manque dans mon exemple les entités de données et les méthodes de réseau. J'inclus uniquement l'exemple d'adaptateur.
la source
@kushal @abdulaziz
Pourquoi ne pas utiliser cette logique à la place?
la source
end_of_list
condition ne sera appelée qu'une seule fois. L'indicateur_isLastItem
est une variable globale dans l'activité qui a une valeur par défaut defalse
. Ce que j'ai fait, c'est d'exécuter une tâche en arrière-plan après avoir détecté la fin de la liste, récupéré la page suivante, puis notifié l'adaptateur du nouvel ensemble de données, et enfin défini_isLastItem
à nouveau sur false.Essayez ci-dessous:
la source
LoadMoreRecyclerView
WrapperLinearLayout
// Ajoutez-le en xml comme
OnCreate ou onViewCreated
callYourService
la source
Il est également possible de l'implémenter sans l'écouteur de défilement, en utilisant uniquement la logique pure du modèle de données. La vue de défilement nécessite d'obtenir les articles par position ainsi que le nombre maximal d'articles. Le modèle peut avoir la logique d'arrière-plan pour extraire les éléments nécessaires en morceaux, plutôt qu'un par un, et le faire dans le thread d'arrière-plan, en avertissant la vue lorsque les données sont prêtes.
Cette approche permet d'avoir la file d'attente de récupération qui préfère les éléments les plus récemment demandés (donc actuellement visibles) aux soumissions plus anciennes (probablement déjà défilées), de contrôler le nombre de threads parallèles à utiliser et d'autres choses du même genre. Le code source complet de cette approche (application de démonstration et bibliothèque réutilisable) est disponible ici .
la source
Il existe une méthode
public void setOnScrollListener (RecyclerView.OnScrollListener listener)
dans https://developer.android.com/reference/android/support/v7/widget/RecyclerView.html#setOnScrollListener%28android.support.v7.widget.RecyclerView.OnScrollListener%29 . Utiliser çaÉDITER:
Remplacez la
onScrollStateChanged
méthode à l'intérieur duonScrollListener
et procédez comme suitla source
onScrollStateChanged
onScrollStateChanged
ne fonctionnera pas car il ne sera appelé que lorsque vous modifiez l'état du défilement et non pendant le défilement.onScrollStateChanged
de déterminer que l'utilisateur fait défiler jusqu'au dernier élément?Vérifiez que tout est expliqué en détail: Pagination à l'aide de RecyclerView de A à Z
loadMoreItems ():
dans MyAdapter:
la source
Aucune de ces réponses ne prend en compte si la liste est trop petite ou non.
Voici un morceau de code que j'utilise qui fonctionne sur RecycleViews dans les deux sens.
la source
Je vous laisse mon aproximation. Fonctionne bien pour moi.
J'espère que ça t'aide.
la source
Cette solution fonctionne parfaitement pour moi.
la source