J'utilise un RecyclerView dans mon application Android. J'ai de nombreuses vues de cartes dans mon RecyclerView, de telle sorte qu'une seule vue de carte est affichée à l'utilisateur à la fois. L'utilisateur doit glisser pour voir la carte suivante.
J'ai été confronté à un problème: lorsque l'utilisateur effectue un balayage, la vue de recyclage est défilée jusqu'à la fin. Au lieu de cela, ce dont j'ai besoin, c’est que lorsque l’utilisateur glisse, affiche la carte suivante à l’utilisateur, comme indiqué dans ce message.
SnapHelper snapHelper = new PagerSnapHelper();
snapHelper.attachToRecyclerView(recyclerView);
J'ai essayé la réponse mentionnée dans le lien ci-dessus. Mais je reçois une exception lorsque l'utilisateur fait un balayage.
S'il vous plaît aidez-moi à le résoudre.
Erreur
Java.lang.IllegalStateException: An instance of OnFlingListener already set.
at Android.support.v7.widget.SnapHelper.setupCallbacks(SnapHelper.Java:114)
at Android.support.v7.widget.SnapHelper.attachToRecyclerView(SnapHelper.Java:102)
at com.abc.ui.trm.TrCard.setupCardView(TrCard.Java:62)
at com.abc.ui.trm.TrCard.setupCardView(TrCard.Java:29)
at com.abc.ui.core.card.BaseCardView.processCardView(BaseCardView.Java:134)
at com.abc.ui.card.CardRecyclerAdapter.onViewAttachedToWindow(CardRecyclerAdapter.Java:398)
at Android.support.v7.widget.RecyclerView.dispatchChildAttached(RecyclerView.Java:6758)
at Android.support.v7.widget.RecyclerView$5.addView(RecyclerView.Java:696)
at Android.support.v7.widget.ChildHelper.addView(ChildHelper.Java:107)
at Android.support.v7.widget.RecyclerView$LayoutManager.addViewInt(RecyclerView.Java:7697)
at Android.support.v7.widget.RecyclerView$LayoutManager.addView(RecyclerView.Java:7655)
at Android.support.v7.widget.RecyclerView$LayoutManager.addView(RecyclerView.Java:7643)
at Android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.Java:1539)
at Android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.Java:1488)
at Android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.Java:585)
at Android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.Java:3506)
at Android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.Java:3254)
at Android.support.v7.widget.RecyclerView.onLayout(RecyclerView.Java:3767)
at Android.view.View.layout(View.Java:18799)
at Android.view.ViewGroup.layout(ViewGroup.Java:5952)
at com.abc.ui.core.refresh.LegacySwipeRefreshLayout.onLayout(LegacySwipeRefreshLayout.Java:337)
at Android.view.View.layout(View.Java:18799)
at Android.view.ViewGroup.layout(ViewGroup.Java:5952)
at Android.widget.FrameLayout.layoutChildren(FrameLayout.Java:323)
at Android.widget.FrameLayout.onLayout(FrameLayout.Java:261)
at Android.view.View.layout(View.Java:18799)
at Android.view.ViewGroup.layout(ViewGroup.Java:5952)
at Android.widget.RelativeLayout.onLayout(RelativeLayout.Java:1079)
at Android.view.View.layout(View.Java:18799)
at Android.view.ViewGroup.layout(ViewGroup.Java:5952)
at Android.widget.FrameLayout.layoutChildren(FrameLayout.Java:323)
at Android.widget.FrameLayout.onLayout(FrameLayout.Java:261)
at Android.view.View.layout(View.Java:18799)
at Android.view.ViewGroup.layout(ViewGroup.Java:5952)
at Android.widget.FrameLayout.layoutChildren(FrameLayout.Java:323)
at Android.widget.FrameLayout.onLayout(FrameLayout.Java:261)
at Android.view.View.layout(View.Java:18799)
at Android.view.ViewGroup.layout(ViewGroup.Java:5952)
at Android.support.v4.widget.DrawerLayout.onLayout(DrawerLayout.Java:1193)
at Android.view.View.layout(View.Java:18799)
at Android.view.ViewGroup.layout(ViewGroup.Java:5952)
at Android.widget.FrameLayout.layoutChildren(FrameLayout.Java:323)
at Android.widget.FrameLayout.onLayout(FrameLayout.Java:261)
at Android.view.View.layout(View.Java:18799)
at Android.view.ViewGroup.layout(ViewGroup.Java:5952)
at Android.widget.LinearLayout.setChildFrame(LinearLayout.Java:1741)
at Android.widget.LinearLayout.layoutVertical(LinearLayout.Java:1585)
at Android.widget.LinearLayout.onLayout(LinearLayout.Java:1494)
at Android.view.View.layout(View.Java:18799)
at Android.view.ViewGroup.layout(ViewGroup.Java:5952)
at Android.widget.FrameLayout.layoutChildren(FrameLayout.Java:323)
at Android.widget.FrameLayout.onLayout(FrameLayout.Java:261)
at com.Android.internal.policy.DecorView.onLayout(DecorView.Java:822)
at Android.view.View.layout(View.Java:18799)
at Android.view.ViewGroup.layout(ViewGroup.Java:5952)
J'ai réussi à résoudre ce problème en ajoutant cette ligne
recyclerView.setOnFlingListener(null);
avant
snapHelper.attachToRecyclerView(recyclerView);
Tout ce que vous avez à faire est de placer
SnapHelper snapHelper = new PagerSnapHelper();
snapHelper.attachToRecyclerView(recyclerView);
dans onCreateViewHolder au lieu de onBindViewHolder
Vous pouvez d'abord vérifier OnFlingListener sur le RecyclerView avant de l'ajouter.
if (recycler.getOnFlingListener() == null)
snapHelper.attachToRecyclerView(recycler);
Placez la ligne suivante:
mRecyclerView.setOnFlingListener(null);
Au dessus de cette ligne:
new LinearSnapHelper().attachToRecyclerView(mRecyclerView)