RecyclerView de défilement horizontale composant logiciel enfichable dans le centre
Je suis en train de faire un carrousel-comme ici à l'aide de RecyclerView, je veux de l'élément de rupture dans le milieu de l'écran lors du défilement, un élément à la fois. J'ai essayé d'utiliser recyclerView.setScrollingTouchSlop(RecyclerView.TOUCH_SLOP_PAGING);
mais la vue est toujours le défilement en douceur, j'ai aussi essayé de mettre en œuvre ma propre logique à l'aide de défilement de l'auditeur comme suit:
recyclerView.setOnScrollListener(new OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
Log.v("Offset ", recyclerView.getWidth() + "");
if (newState == 0) {
try {
recyclerView.smoothScrollToPosition(layoutManager.findLastVisibleItemPosition());
recyclerView.scrollBy(20,0);
if (layoutManager.findLastVisibleItemPosition() >= recyclerView.getAdapter().getItemCount() - 1) {
Beam refresh = new Beam();
refresh.execute(createUrl());
}
} catch (Exception e) {
e.printStackTrace();
}
}
Le mouvement de balayage de droite à gauche fonctionne bien maintenant, mais pas dans l'autre sens, ce qui me manque ici ?
Vous devez vous connecter pour publier un commentaire.
Avec
LinearSnapHelper
, c'est maintenant très facile.Tout ce que vous devez faire est ceci:
Mise à jour
Disponible depuis 25.1.0,
PagerSnapHelper
peut aider à atteindre lesViewPager
comme l'effet. L'utiliser comme vous le feriez utiliser leLinearSnapHelper
.Vieille solution de contournement:
Si vous le souhaitez pour un fonctionnement semblable à la
ViewPager
, essayez plutôt ceci:La mise en œuvre ci-dessus renvoie simplement la position à côté de l'élément courant (centrée) en fonction de la direction de la vitesse, indépendamment de l'ampleur.
L'ancien est une première partie de la solution inclus dans la Bibliothèque de prise en charge de la version 24.2.0.
Ce qui signifie que vous devez ajouter à votre application du module
build.gradle
ou le mettre à jour.LinearLayoutManager
où les points de vue, tous ont été ordinaire dans la taille. Rien d'autre, mais l'extrait ci-dessus est nécessaire.LinearSnapHelper
.Google I/O 2019 Mise À Jour:
ViewPager2 est ici!
Google tout juste annoncé au parler Quoi de neuf dans Android' (aka "Le Android keynote') qu'ils travaillent sur un nouveau ViewPager basé sur RecyclerView!
De la glisse:
Vous pouvez consulter la dernière version ici et les notes de version ici.
Opinion personnelle: je pense que c'est un vraiment besoin de plus. J'ai récemment eu beaucoup de mal avec le
PagerSnapHelper
oscillant de gauche à droite indéfiniment - voir le billet j'ai ouvert.Nouvelle réponse (2016):
Vous pouvez maintenant utiliser la SnapHelper.
Si vous voulez une aligné au centre de claquer un comportement similaire à ViewPager ensuite utiliser un PagerSnapHelper:
Il y a aussi un LinearSnapHelper. Je l'ai essayé et si vous fling avec de l'énergie alors qu'il défile 2 éléments avec 1 fling. Personnellement, je n'aimais pas ça, mais il suffit de décider par vous-même - essayer, il ne prend que quelques secondes.
Réponse originale à cette question (2016):
Après de nombreux heures de l'essayer 3 différentes solutions trouvées ici DONC je l'ai enfin construit une solution qui imite de très près le comportement que dans un
ViewPager
.La solution est basée sur l' @eDizzle solution, qui, je crois que je me suis amélioré suffit de dire qu'il fonctionne presque comme un
ViewPager
.Important: mon
RecyclerView
éléments de largeur est exactement le même que l'écran. Je n'ai pas essayé avec d'autres tailles. Aussi je l'utilise avec une horizontaleLinearLayoutManager
. Je pense que vous devrez adapter le code si vous voulez de défilement verticale.Ici vous avez le code:
Profitez-en!
RecyclerView
doit être utilisé avecandroid.support.v7.widget.RecyclerView
pour être adaptable pour les plus faibles de l'API et cette méthode vous oblige à utiliser votre propre balise xml.int lastVisibleItemPosition = linearLayoutManager.getReverseLayout() ? linearLayoutManager.findFirstVisibleItemPosition() : linearLayoutManager.findLastVisibleItemPosition(); View lastView = linearLayoutManager.findViewByPosition(lastVisibleItemPosition); int firstVisibleItemPosition = linearLayoutManager.getReverseLayout() ? linearLayoutManager.findLastVisibleItemPosition() : linearLayoutManager.findFirstVisibleItemPosition(); View firstView = linearLayoutManager.findViewByPosition(firstVisibleItemPosition);
SnapHelper snapHelper = new PagerSnapHelper(); snapHelper.attachToRecyclerView(mRecyclerView);
Si l'objectif est de faire de la
RecyclerView
de mimer le comportement deViewPager
il est assez facile d'approcheEn utilisant
PagerSnapHelper
vous pouvez obtenir le comportement commeViewPager
LinearSnapHelper
au lieu dePagerSnapHelper
et ça marche pour moiLinearSnapHelper
LinearSnapHelper
, et il s'accroche à un moyen de l'élément.PagerSnapHelper
empêche de naviguer facilement (au moins, une liste d'images).Vous devez utiliser findFirstVisibleItemPosition pour aller dans la direction opposée. Et pour la détection de la direction du glissement a été en, vous en aurez besoin pour obtenir le fling de vitesse ou le changement de x. J'ai abordé ce problème à partir d'un angle légèrement différent que ce que vous avez.
Créer une nouvelle classe qui étend la RecyclerView classe, puis remplacer RecyclerView du fling méthode comme suit:
Ma solution:
Je passe cette disposition du gestionnaire de l'RecycledView et réglez le décalage nécessaire pour centrer les éléments. Tous mes articles ont la même largeur, de sorte décalage constant est ok
Juste ajouter
padding
etmargin
àrecyclerView
etrecyclerView item
:recyclerView élément:
recyclerView:
et définir
PagerSnapHelper
:dp px:
résultat:
PagerSnapHelper
ne fonctionne pas avecGridLayoutManager
avec spanCount > 1, donc ma solution dans ce cas est: