Sur un RecyclerView, je suis capable de faire défiler soudainement vers le haut d'un élément sélectionné en utilisant:
((LinearLayoutManager) recyclerView.getLayoutManager()).scrollToPositionWithOffset(position, 0);
Cependant, cela déplace brusquement l'élément vers la position supérieure. Je souhaite passer en haut d'un élément en douceur .
J'ai aussi essayé:
recyclerView.smoothScrollToPosition(position);
mais cela ne fonctionne pas bien car il ne déplace pas l'élément vers la position sélectionnée vers le haut. Il fait simplement défiler la liste jusqu'à ce que l'élément sur la position soit visible.
protected int getHorizontalSnapPreference() { return LinearSmoothScroller.SNAP_TO_START; }
. De plus, j'ai dû implémenter la méthode abstraitepublic PointF computeScrollVectorForPosition(int targetPosition) { return layoutManager.computeScrollVectorForPosition(targetPosition); }
.pour cela, vous devez créer un LayoutManager personnalisé
utilisez ceci pour votre RecyclerView et appelez smoothScrollToPosition.
exemple :
cela fera défiler vers le haut de l'élément RecyclerView de la position spécifiée.
J'espère que cela t'aides.
la source
smoothScrollToPosition
. Pourquoi ce problème peut-il se produire? Merci.C'est une fonction d'extension que j'ai écrite dans Kotlin à utiliser avec le
RecyclerView
(basé sur la réponse @Paul Woitaschek):Utilisez-le comme ceci:
la source
On peut essayer comme ça
la source
Remplacer la fonction CalculateDyToMakeVisible / CalculateDxToMakeVisible dans LinearSmoothScroller pour implémenter la position de décalage Y / X
la source
Le moyen le plus simple que j'ai trouvé pour faire défiler a
RecyclerView
est le suivant:la source
J'ai utilisé comme ça:
la source
Merci, @droidev pour la solution. Si quelqu'un cherche une solution Kotlin, référez-vous à ceci:
la source
CustomLinearLayout.kt:
Remarque: l' exemple ci-dessus est défini sur la direction HORIZONTALE, vous pouvez passer VERTICAL / HORIZONTAL lors de l'initialisation.
Si vous définissez la direction sur VERTICAL, vous devez modifier le paramètre " CalculateDxToMakeVisible " en " CalculateDyToMakeVisible " ( faites également attention à la valeur de retour d'appel du supertype)
Activité / Fragment.kt :
la source
L'approche @droidev est probablement la bonne, mais je veux juste publier quelque chose d'un peu différent, qui fait essentiellement le même travail et ne nécessite pas l'extension du LayoutManager.
REMARQUE ici - cela fonctionnera bien si votre élément (celui que vous souhaitez faire défiler en haut de la liste) est visible à l'écran et que vous souhaitez simplement le faire défiler automatiquement vers le haut. Cela est utile lorsque le dernier élément de votre liste comporte une action, qui ajoute de nouveaux éléments dans la même liste et que vous souhaitez concentrer l'utilisateur sur les nouveaux éléments ajoutés:
L'idée est simple: 1. Nous devons obtenir la coordonnée supérieure de l'élément recyclerview; 2. Nous devons obtenir la coordonnée supérieure de l'élément de vue que nous voulons faire défiler vers le haut; 3. À la fin du décalage calculé, nous devons faire
200 n'est qu'un exemple de valeur entière codée en dur que vous pouvez utiliser si l'élément de visualisation n'existe pas, car cela est également possible.
la source
Je souhaite aborder plus en détail la question de la durée du défilement , qui, si vous choisissez une réponse antérieure, variera en fait considérablement (et de manière inacceptable) en fonction de la quantité de défilement nécessaire pour atteindre la position cible à partir de la position actuelle.
Pour obtenir une durée de défilement uniforme, la vitesse (pixels par milliseconde) doit tenir compte de la taille de chaque élément individuel - et lorsque les éléments sont de dimension non standard, un tout nouveau niveau de complexité est ajouté.
C'est peut-être pourquoi les développeurs de RecyclerView ont déployé le panier trop dur pour cet aspect vital du défilement fluide.
En supposant que vous vouliez une durée de défilement semi-uniforme et que votre liste contienne des éléments semi-uniformes , vous aurez besoin de quelque chose comme ça.
PS: Je maudis le jour où j'ai commencé à convertir sans discernement ListView en RecyclerView .
la source
Vous pouvez inverser votre liste
list.reverse()
et enfin appelerRecylerView.scrollToPosition(0)
la source