web-dev-qa-db-fra.com

Une instance de OnFlingListener déjà définie dans Recyclerview

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.

Comment faire glisser votre doigt sur la vue de recyclage horizontale pour afficher uniquement l'élément suivant - Android

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)
13
Nitya

J'ai réussi à résoudre ce problème en ajoutant cette ligne 

recyclerView.setOnFlingListener(null); 

avant 

snapHelper.attachToRecyclerView(recyclerView);
32
Mohamed ALOUANE

Tout ce que vous avez à faire est de placer

SnapHelper snapHelper = new PagerSnapHelper();
snapHelper.attachToRecyclerView(recyclerView);

dans onCreateViewHolder au lieu de onBindViewHolder

3
Bassel Mourjan

Vous pouvez d'abord vérifier OnFlingListener sur le RecyclerView avant de l'ajouter.

if (recycler.getOnFlingListener() == null)
        snapHelper.attachToRecyclerView(recycler);
2
saintjab

Placez la ligne suivante:

mRecyclerView.setOnFlingListener(null);

Au dessus de cette ligne:

new LinearSnapHelper().attachToRecyclerView(mRecyclerView)
0
Sumit Singh