Je cherche un moyen de faire défiler a RecyclerView
pour afficher l'élément sélectionné en haut.
Dans un, ListView
j'ai pu le faire en utilisant scrollTo(x,y)
et en récupérant le haut de l'élément qui doit être centré.
Quelque chose comme:
@Override
public void onItemClick(View v, int pos){
mylistView.scrollTo(0, v.getTop());
}
Le problème est que le RecyclerView
renvoie une erreur lors de l'utilisation de sa scrollTo
méthode en disant
RecyclerView ne prend pas en charge le défilement vers une position absolue
Comment faire défiler a RecyclerView
pour placer l'élément sélectionné en haut de la vue?
Si vous recherchez un gestionnaire LinearLayout vertical, vous pouvez obtenir un défilement fluide en utilisant une personnalisation
LinearSmoothScroller
:utiliser une instance du gestionnaire de mise en page dans la vue de recyclage, puis appeler
recyclerView.smoothScrollToPosition(pos);
le défilement en douceur jusqu'à la position sélectionnée en haut de la vue du recycleurla source
getHorizontalSnapPreference()
les listes TopSnappedSmoothScroller for Horizontal.RecyclerView
? Ce qui veut dire: Cela ne semble pas fonctionner pour le dernier élément - quelles que soient lesSNAP_TO_START
lesRecyclerView
seuls rouleaux jusqu'à ce que l'élément devient visible au fond , mais ne se déplace pas sur toute la hauteur. Des idées sur la façon d'y parvenir? (J'ai travaillé autour de cela en définissant un rembourrage personnalisé sur leRecyclerView
mais cela ne semble pas vraiment correct ...)// Position de l'élément de défilement
la source
Vous avez juste besoin d'appeler
recyclerview.scrollToPosition(position)
. C'est très bien!Si vous voulez l'appeler dans l'adaptateur, laissez simplement votre adaptateur avoir l'instance de recyclerview ou l'activité ou le fragment qui contient recyclerview, puis implémente la méthode
getRecyclerview()
en eux.J'espère que cela peut vous aider.
la source
idem avec régulateur de vitesse
la source
Essayez ce qui a fonctionné pour moi cool!
Créer une variable
private static int displayedposition = 0;
Maintenant, pour la position de votre RecyclerView dans votre activité.
Placez cette déclaration à l'endroit où vous souhaitez qu'elle place l'ancien site affiché dans votre vue.
Eh bien c'est ça, ça a bien fonctionné pour moi \ o /
la source
il suffit d'appeler cette méthode simplement:
au lieu de:
la source
ce que j'ai fait pour restaurer la position de défilement après avoir actualisé le bouton RecyclerView sur cliqué:
obtenir le décalage du premier élément visible par le haut avant de créer l'objet linearLayoutManager et après l'avoir instancié, scrollToPositionWithOffset de l'objet LinearLayoutManager a été appelé.
la source
Je ne sais pas pourquoi je n'ai pas trouvé la meilleure réponse mais c'est vraiment simple.
Aucune erreur
Crée des animations
la source
faites défiler à une position particulière
et cela m'a beaucoup aidé. par un écouteur de clic, vous pouvez obtenir la position dans votre adaptateur
la source
la source
Aucune des réponses n'explique comment afficher les derniers éléments en haut. Ainsi, les réponses ne fonctionnent que pour les éléments qui ont encore suffisamment d'éléments au-dessus ou en dessous pour remplir le reste
RecyclerView
. Par exemple, s'il y a 59 éléments et qu'un 56e est sélectionné, il devrait être en haut comme dans l'image ci-dessous:Nous pourrions gérer ces cas en utilisant
linearLayoutManager.scrollToPositionWithOffset(pos, 0)
et une logique supplémentaire dansAdapter
ofRecyclerView
- en ajoutant une marge personnalisée sous le dernier élément (si le dernier élément n'est pas visible, cela signifie qu'il y a suffisamment d'espace pour remplir leRecyclerView
). La marge personnalisée peut être une différence entre la hauteur de la vue racine et la hauteur de l'élément. Ainsi, votreAdapter
forRecyclerView
ressemblerait à ceci:la source
Dans mon cas, j'ai
RecyclerView
un rembourrage comme celui-ciEnsuite, pour faire défiler un élément vers le haut, je dois
la source
Si votre
LayoutManager
estLinearLayoutManager
utilisez - vousscrollToPositionWithOffset(position,0);
sur elle et il fera de votre point le premier élément visible dans la liste. Dans le cas contraire, vous pouvez utilisersmoothScrollToPosition
leRecyclerView
directement.J'ai fini par utiliser le code ci-dessous.
la source
J'utilise le code ci-dessous pour faire défiler en douceur un élément (thisView) vers le haut.
Il fonctionne également pour GridLayoutManager avec des vues de différentes hauteurs:
Semble fonctionner suffisamment bien pour une solution rapide.
la source
thisPosition
?