Eine Instanz von OnFlingListener, die bereits in Recyclerview festgelegt ist

Lesezeit: 5 Minuten

Nityas Benutzeravatar
Nitya

Ich verwende ein RecyclerView in meiner Android-App. Ich habe viele Kartenansichten in meiner RecyclerView, sodass dem Benutzer jeweils nur eine Kartenansicht angezeigt wird. Der Benutzer muss wischen, um die nächste Karte zu sehen.

Ich hatte ein Problem, bei dem der Recyclerview bis zum Ende gescrollt wird, wenn der Benutzer einen Wischvorgang ausführt. Was ich stattdessen brauche, ist, wenn der Benutzer wischt, dem Benutzer die nächste Karte anzuzeigen, wie in diesem Beitrag erwähnt.

So bringen Sie durch Wischen auf der horizontalen Recycler-Ansicht nur das nächste Element ins Blickfeld – Android

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

Ich habe die im obigen Link erwähnte Antwort versucht. Aber ich erhalte eine Ausnahme, wenn der Benutzer einen Wischvorgang ausführt.

Bitte helfen Sie mir, es zu lösen.

Fehler

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)

  • Hilft das etwas? stackoverflow.com/questions/26370289/…

    – Nabin

    18. Mai 2017 um 10:45 Uhr

  • Sehen Sie sich die zweite Antwort an und kommentieren Sie sie auch. 🙂

    – Nabin

    18. Mai 2017 um 10:47 Uhr

Ich habe es geschafft, dies zu lösen, indem ich diese Zeile hinzugefügt habe

recyclerView.setOnFlingListener(null); 

Vor

snapHelper.attachToRecyclerView(recyclerView);

  • einfache und einfache Lösung. Es mag eine hackige Lösung sein, aber soweit ich die komplizierte Implementierung von SnapHelper sehe, ist es die beste Lösung und sollte die akzeptierte Antwort sein.

    – Opiatefuchs

    12. Juli 2017 um 11:58 Uhr

  • Das Hinzufügen von clearOnScrollListeners () und setOnFlingListener (null) löste mein Problem

    – Kiran

    7. Dezember 2017 um 10:33 Uhr

  • Ich habe diesen Fehler erhalten, wenn ich die Daten erneut auf die Recycler-Ansicht setze und hinzufüge setOnFlingListener bewirkte die recyclerView.addOnScrollListener. Es löste nach dem zweiten Datensatz nicht aus. Also habe ich mein Fragment erneut aufgerufen, indem ich ihm Argumente gesetzt habe.

    – Prabs

    6. Juli 2018 um 12:07 Uhr

  • @NoumanCh Hast du dein Problem schon gelöst? Und haben Sie eine Ergänzung dazu, wie Sie es für uns gelöst haben?

    – Rik van Velzen

    28. September 2018 um 11:33 Uhr

  • @RikvanVelzen ja, ich hatte es auf einige Arten gelöst, an die ich mich jetzt nicht erinnere.

    – Nouman Ch

    28. September 2018 um 11:36 Uhr

Sie können zuerst in der RecyclerView nach OnFlingListener suchen, bevor Sie ihn hinzufügen

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

Alles, was Sie tun müssen, ist Platz

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

Innerhalb onCreateViewHolder Anstatt von onBindViewHolder

Dies geschieht, weil Sie die festlegen SnapPagerHelper zweimal irgendwie. Beachten Sie, dass, wenn Sie eine haben RecyclerView in einem anderen RecyclerViewsollte dies nur in den Konstruktoren des jeweils anderen oder Kotlins passieren init {} Block (einmal pro Artikel).
Mein Fall ist Ihrem ziemlich ähnlich, da ich eine große Vertikale habe RecyclerView und ein kleines RecyclerView innerhalb.

Code, der die Ausnahme verursacht:

 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)

}

Richtiger Code mit init {} Block:

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

etwas wie das:

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

Benutzeravatar von Mukesh Kumar Patel
Mukesh Kumar Patel

Ich bekomme auch einen Fehler in nested RecyclerView oder inner RecyclerView, ich habe es geschafft, dies mit dem Hinzufügen dieser Zeile zu lösen.

holder.rv_sub_loaction.setOnFlingListener(null);

Gesamter 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);

1394200cookie-checkEine Instanz von OnFlingListener, die bereits in Recyclerview festgelegt ist

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy