'An instance of OnFlingListener already set in Recyclerview

I'm using a RecyclerView in my Android app. I've many cardviews in my RecyclerView, such that only 1 cardview is displayed to the user at a time. The user has to swipe to see the next card.

I faced an issue that when user makes a swipe, the recyclerview gets scrolled to the end. Instead, what I need is when the user swipes, display the next card to the user as mentioned in this post.

How to make swipe on horizontal recyclerview bring only the next item into view - Android

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

I tried the answer mentioned in the above link. But I'm getting an exception when the user makes a swipe.

Please help me resolve it.

Error

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)


Solution 1:[1]

I managed to sovle this with adding this line

recyclerView.setOnFlingListener(null); 

before

snapHelper.attachToRecyclerView(recyclerView);

Solution 2:[2]

You can check for OnFlingListener on the RecyclerView first before you add it

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

Solution 3:[3]

All you have to do is place

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

inside onCreateViewHolder instead of onBindViewHolder

Solution 4:[4]

This happens because you're setting the SnapPagerHelper twice somehow. Note that if you have a RecyclerView inside another RecyclerView, this should only happen in each other's constructors or Kotlin's init {} block (once per item).
My case is quite similar to yours since I have a big vertical RecyclerView and a small RecyclerView within.

Code that will cause the exception:

 fun bind(value: ArrayList<Item>) {
    listAdapter = ItemCellDelegate(value)

    val manager = LinearLayoutManager(itemView.context)
    manager.orientation = LinearLayoutManager.HORIZONTAL

    horizontalRecyclerView?.apply {
        layoutManager = manager
        adapter = listAdapter
        setHasFixedSize(true)
    }

    val snapHelper: SnapHelper = PagerSnapHelper()
    snapHelper.attachToRecyclerView(horizontalRecyclerView)

}

Correct code using init {} block:

init {
    val snapHelper: SnapHelper = PagerSnapHelper()
    snapHelper.attachToRecyclerView(horizontalRecyclerView)
}

Solution 5:[5]

something like this:

override fun onAttachedToWindow(view: RecyclerView) {
    super.onAttachedToWindow(view)
    view.onFlingListener = null;
    StartSnapHelper().attachToRecyclerView(view)
}

Solution 6:[6]

I also getting Error in neasted RecyclerView or inner RecyclerView, I managed to sovle this with adding this line.

holder.rv_sub_loaction.setOnFlingListener(null);

Whole recyclerView set code:

subLocationModels.addAll(response.body());
            recyclerDataAdapter = new SubSubLocationAdapter(subLocationModels);
            SnapHelper helper = new LinearSnapHelper();
            LinearLayoutManager layoutManager = new  GridLayoutManager(mContext, 2, GridLayoutManager.HORIZONTAL, false);
            holder.rv_sub_loaction.setLayoutManager(layoutManager);
            holder.rv_sub_loaction.setOnFlingListener(null);
            holder.rv_sub_loaction.setAdapter(recyclerDataAdapter);
            helper.attachToRecyclerView(holder.rv_sub_loaction);
            holder.rv_sub_loaction.setHasFixedSize(true);

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Mohamed ALOUANE
Solution 2 saintjab
Solution 3 Bassel Mourjan
Solution 4 pamobo0609
Solution 5 Iman Marashi
Solution 6 Mukesh Kumar Patel