RecyclerView stürzt ab, wenn "verschrottete oder angehängte Ansichten möglicherweise nicht recycelt werden"

114

Ich verwende eine einfache Implementierung RecyclerViewvon der Android-Website mit a StaggeredGridLayoutManagerund erhalte immer wieder den Fehler, der meine App zum Absturz bringt:

java.lang.IllegalArgumentException: Scrapped or attached views may not be recycled. isScrap:false isAttached:true
            at android.support.v7.widget.RecyclerView$Recycler.recycleViewHolderInternal(RecyclerView.java:3501)
            at android.support.v7.widget.RecyclerView$LayoutManager.scrapOrRecycleView(RecyclerView.java:5355)
            at android.support.v7.widget.RecyclerView$LayoutManager.detachAndScrapAttachedViews(RecyclerView.java:5340)
            at android.support.v7.widget.StaggeredGridLayoutManager.onLayoutChildren(StaggeredGridLayoutManager.java:572)
            at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:1918)
            at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:2155)
            at android.view.View.layout(View.java:14008)
            at android.view.ViewGroup.layout(ViewGroup.java:4373)
            at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1021)
            at android.view.View.layout(View.java:14008)
            at android.view.ViewGroup.layout(ViewGroup.java:4373)
            at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
            at android.view.View.layout(View.java:14008)
            at android.view.ViewGroup.layout(ViewGroup.java:4373)
            at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
            at android.view.View.layout(View.java:14008)
            at android.view.ViewGroup.layout(ViewGroup.java:4373)
            at android.support.v7.internal.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:502)
            at android.view.View.layout(View.java:14008)
            at android.view.ViewGroup.layout(ViewGroup.java:4373)
            at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
            at android.view.View.layout(View.java:14008)
            at android.view.ViewGroup.layout(ViewGroup.java:4373)
            at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1663)
            at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1521)
            at android.widget.LinearLayout.onLayout(LinearLayout.java:1434)
            at android.view.View.layout(View.java:14008)
            at android.view.ViewGroup.layout(ViewGroup.java:4373)
            at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
            at android.view.View.layout(View.java:14008)
            at android.view.ViewGroup.layout(ViewGroup.java:4373)
            at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:1892)
            at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1711)
            at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:989)
            at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4351)
            at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749)
            at android.view.Choreographer.doCallbacks(Choreographer.java:562)
            at android.view.Choreographer.doFrame(Choreographer.java:532)
            at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735)
            at android.os.Handler.handleCallback(Handler.java:725)
            at android.os.Handler.dispatchMessage(Handler.java:92)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:5041)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
            at dalvik.system.NativeStart.main(Native Method)  

Mit einfach meine ich wörtlich, dass es sich um dieselbe Implementierung handelt, die von dieser Seite auf ihrer Website übernommen wurde. Der einzige Unterschied besteht darin, dass das Layout meines Rasterelements ein ImageViewund ein paar TextViewSekunden beträgt, sodass ich meinen Code nicht erneut veröffentlichen muss.

Bekommt sonst noch jemand diesen Fehler und weiß, wie man damit umgeht?

StackOverflowMaster
quelle
Hast du eine Lösung?
Pratik Butani

Antworten:

191

Dieser Fehler wird verursacht, wenn Sie in Ihrem XML den Wert android:animateLayoutChangestrue festgelegt haben und notifyDataSetChanged()den RecyclerView-Adapter im Java-Code aufrufen .

Vermeiden Sie daher die Verwendung android:animateLayoutChangesmit RecyclerViews.

StackOverflowMaster
quelle
22
Wie kann man dann die Funktion animateLayoutChanges in recyclerview verwenden?
Dhuma1981
Was versuchst du zu erreichen? Artikelanimation? Wenn ja, unterstützt die RecyclerView-API dies - sehen Sie sich die Dokumentation an: developer.android.com/reference/android/support/v7/widget/…
Kenneth
4
@ dhuma1981 wenn der Elementanimator über mRecyclerView.setItemAnimator (neuer DefaultItemAnimator ()) festgelegt wird; dann muss animateLayoutChanges nicht wahr sein
Rich Ehmer
RecyclerViewverwendet DefaultItemAnimatorstandardmäßig.
Benjamin
-, - Ich habe dieses Problem genau so, wie du es beschrieben hast
Ninja Coding
52

Ich musste mich auch mit diesem Absturz auseinandersetzen und in meinem Fall hatte es nichts damit zu tun android:animateLayoutChanges.

Das, das RecyclerViewwir bauten, hatte mehr als eine Art von Ansichten und einige hatten EditTexts in ihnen. Nach einer Weile haben wir das Problem auf fokusbezogen festgelegt. Dieser Fehler tritt beim Recycling auf EditTextund einer von ihnen ist fokussiert.

Natürlich haben wir versucht, den Fokus zu löschen, wenn neue Daten an eine recycelte Ansicht gebunden werden, aber das hat erst funktioniert, wenn sie android:focusableInTouchMode="true"aktiviert sind RecycleView. Tatsächlich ist dies die einzige Änderung, die am Ende erforderlich war, damit dieses Problem behoben werden konnte.

Nemanja Kovacevic
quelle
2
Fantastische, mehrere Probleme im Zusammenhang mit dem Fokus, die ich bei der Verwendung von EditTexts in einer RecyclerView hatte. Vielen Dank!
Rabie Jradi
1
Ich hatte ACET in recyclerview, und es zerquetscht. Dieser Beitrag hat mich gerettet.
Kai Wang
Und ich habe keine Edittexte in Artikeln, aber ich habe Kontrollkästchen. sollte ich es versuchen, android:focusableInTouchMode="true"weil es nur manchmal in einigen Geräten passiert (selten) und ich vermute, dass es nicht mit meinem Problem zusammenhängt, aber Stack-Trace für Absturz ist fast gleich.
Shivansh
Dies war mein Fall, aber die Einstellung android:focusableInTouchMode="true"hat mir überhaupt nicht geholfen. Also habe ich den Fokus im onViewDetachedFromWindowRückruf gelöscht . public void onViewDetachedFromWindow(@NonNull RecyclerView.ViewHolder holder) { if (holder instanceof ItemViewHolder) { ItemViewHolder item = (ItemViewHolder) holder; if (item.editText.isFocused()) item.editText.clearFocus(); } }
Artman
24

Ich habe die android:animateLayoutChangesEigenschaft aus dem Layout entfernt und das Problem wurde behoben.

Özer Özcan
quelle
Ich bekam diesen Absturz, als ich das auch android:animateLayoutChangesauf mein Wohnmobil legte.
Mauker
2
Hatte dieses Flag auf dem übergeordneten Container gesetzt (Relatives Layout). Das Problem wurde behoben.
1911z
@ 1911z Wollen Sie damit sagen, dass Sie das Flag auf dem übergeordneten Container hatten und das Entfernen von dort das Problem behoben hat?
RamPrasadBismil
14

Überprüfen Sie unter anderem, ob dieses Problem android:animateLayoutChanges="true"auf RecyclerView festgelegt wurde. Dies führt dazu, dass das Recycling und das erneute Anbringen der RecyclerView-Elemente fehlschlägt. Entfernen Sie es und weisen Sie das Attribut dem übergeordneten Container von RecyclerView zu, z. B. einem LinearLayout / RelativeLayout. Das Problem sollte dann behoben sein.

Ram Iyer
quelle
Ich habe diesen Absturz gesehen, obwohl ich das Attribut für den übergeordneten Container des Wohnmobils festgelegt habe.
RamPrasadBismil
@RamPrasadBismil Bitte poste deinen Code und vielleicht können wir ihn uns ansehen?
Ram Iyer
12

Ich habe zwei Tage gebraucht, konnte das aber nicht umgehen. Am Ende musste ich den Artikel-Prefetch deaktivieren.

Beim Einstellen des Layout-Managers können Sie einfach anrufen

mGridLayoutManager.setItemPrefetchEnabled(false);

Es hat den Fehler für mich verschwinden lassen. Hoffe, es wird für jemanden nützlich sein.

Max
quelle
Hat für mich gearbeitet. Vielen Dank.
Vicky
1
Ich mache mir wirklich Sorgen, dass die Leute diese Lösung übernehmen. Sie verlieren viel, wenn Sie diese Flagge deaktivieren, und der Fehler befindet sich immer noch an einer anderen Stelle -
Felipe Castilhos
8

Bei der Verwendung von Slimfit Sticky Headern ist dieser Fehler aufgetreten. Es wurde verursacht, weil die erste Position falsch eingestellt wurde. Ich habe die Antwort hier

public void onBindViewHolder(MainViewHolder holder, int position) {

  final View itemView = holder.itemView;
  final LayoutManager.LayoutParams params = LayoutManager.LayoutParams.from(itemView.getLayoutParams());

  params.setSlm(LinearSLM.ID);
  params.width = ViewGroup.LayoutParams.MATCH_PARENT;
  params.setFirstPosition(item.mSectionFirstPosition);
  itemView.setLayoutParams(params);

}

Stellen Sie einfach sicher, dass Sie den korrekten Wert für mSectionFirstPosition übergeben

Jaspinder Kaur
quelle
Willkommen bei StackOverflow. Könnten Sie bitte eine vollständige Antwort anstelle nur eines Links geben?
Slfan
was ist itemhier
Fehler passieren
Dies ist das Listenelement, das in der Recycler-Ansicht angezeigt werden soll. Im Grunde speichere ich also die erste Position des Abschnitts für jedes Listenelement.
Jaspinder Kaur
8

Ich bin heute Morgen auf dieses Problem gestoßen, habe aber nicht den gleichen Grund wie oben erwähnt.

Beim Debuggen habe ich festgestellt, dass die Elementansicht in meinem ViewHolder mParentnicht null ist, was im Normalfall keine sein sollte (das ist das Protokoll mit der Aufschrift "Angehängte Ansicht darf nicht recycelt werden"). Ich denke, dies bedeutet, dass die untergeordnete Ansicht ist bereits an ein Elternteil angehängt, würde dies beim Recycling zu Fehlern führen.)

Aber ich habe die untergeordnete Ansicht nicht jedes Mal manuell angehängt. Und ich habe festgestellt, dass dies erledigt ist, wenn ich versuche, die untergeordnete Ansicht in meinem ViewHolder aufzublähen.

layoutInflater.inflate(@LayoutRes int resource, @Nullable ViewGroup root, boolean attachToRoot)

Und der letzte Parameter attachToRootsollte falsch sein.

Nachdem ich es geändert habe false, habe ich mein Problem behoben.

Ich sehe diesen Absturz übrigens nur, wenn ich meine Support-Bibliothek auf die neueste Version 25.0.0 aktualisiere. Bevor ich Version 23.4.0 verwendet habe und dieses Problem nicht auftritt. Ich denke, in der neuesten Support-Bibliothek sollte sich etwas geändert haben.

Ich hoffe das hilft.

Anthonyeef
quelle
8

Ich habe auch den gleichen Fehler beim Scrollen auf dem RecyclerView: dann habe ich animateLayoutChanges="true"in der Layout-Datei entfernt, RecyclerViewdann hat alles funktioniert.

user8796389
quelle
6

In meinem Fall geschah dies, weil ich Transitionbeim Versuch, die Größe von RecyclerView zu ändern, ausgeführt wurde, weil die Softwaretastatur angezeigt werden sollte.

Ich reparierte es meinen Ausschluß den RecyclerView von dem Transitiondurch die Verwendung Transition.excludeTarget(R.id.recyclerview, true);

Tunji_D
quelle
5

Auch ich bekam diesen Fehler, wenn ich animateLayoutChanges = "true" in der Layoutdatei für RecyclerView hatte. Löschen Sie dieses Attribut und der Fehler verschwindet!

rvd
quelle
Bitte beachten Sie, dass diese Frage aus dem Jahr 2014 stammt und sich die Eigenschaften möglicherweise inzwischen geändert haben.
Korashen
2
Nein, es ist noch nicht geändert
Sanjay Kushwah
5

Es gibt eine Reihe von Gründen, warum diese Ausnahme aufgerufen wird. In meinem Fall lag es an laufenden Animationen, weshalb die Ansichten immer noch angehängt sind und nicht in die Ansicht entfernt werden konnten. Erst wenn die Animation beendet ist, kann die Ansicht entfernt und recycelt werden.

Es gibt zwei Arten von Animationen, die sich auf das Recycling der Recyclingansicht auswirken können.

1) Ist das RecyclerView.ItemAnimator- das sollte nicht das Problem sein. Dies sollte ziemlich sicher zu verwenden sein, da es nach Anhängen und Verschrottungen sucht und das Recycling ordnungsgemäß handhabt.

2) android:animateLayoutChanges="true"oder TransitionManager.beginDelayedTransition()oder TransitionManager.go () usw. - Diese Animationen werden von selbst ausgeführt und greifen auf die zu animierenden Elemente zu. Dies führt dazu, dass die Ansichten zwangsweise angehängt werden müssen, bis die Animation beendet ist. Das Recyclerview hat keine Kenntnis von diesen Animationen, da es außerhalb seines Bereichs liegt. Daher wird recyclerviewmöglicherweise versucht, ein Element zu recyceln, da es möglicherweise ordnungsgemäß recycelt werden kann. Das Problem besteht jedoch darin, dass diese APIs die Ansichten bis zum Abschluss der Animation beibehalten.

Wenn Sie android:animateLayoutChanges="true"oder TransitionManager.beginDelayedTransition()oder TransitionManager.go () usw. verwenden, entfernen Sie einfach das RecyclerViewund seine untergeordneten Elemente aus der Animation.

Sie können dies einfach tun, indem Sie das ergreifen Transitionund anrufen

Transition.excludeChildren(yourRecyclerView, true)
Transition.excludeTarget(yourRecyclerView, true)

Hinweis:

Beachten Sie, dass es wichtig ist Transition.excludeChildren(), alle RecyclerviewKinder von der Animation auszuschließen und nicht nur sich Recyclerviewselbst.

Archie G. Quiñones
quelle
Vielen Dank! TransitionManager.beginDelayedTransition () war in meinem Fall die Ursache des Problems. Sie können Ihr Codebeispiel mit weiteren Details zur Verwendung aktualisieren Transition.excludeChildren. Sie instanziieren ein Übergangsobjekt wie : val transition = AutoTransition(), rufen excludeChildren(recyclerView, true)dieses Objekt auf und übergeben es an beginDelayedTransaction() as the second parameter.
Danilo Prado
4

Während in meinem Fall das Entfernen animateOnLayoutChangeaus der recyclerView den Absturz behebte, brauchte ich dennoch die Möglichkeit, die Layoutänderungen im viewHolder zu animieren. Damit dies funktioniert, muss LinearLayout' in the view holder needs theanimateOnLayoutChange 'auf true gesetzt werden, aber ich musste notifyItemChangedauf den Adapter. Dadurch konnten beide layoutTransition-Animationen gestartet werden (zum Erweitern und Reduzieren des viewHolder) und die verschrottete Ausnahme vermieden werden. Vermeiden Sie es also, animateOnLayoutChange in die recylcerView einzufügen, und verwenden Sie die verschiedenen Benachrichtigungsmethoden, um die Standardanimationen für Änderungen der Ansichtsgröße zu aktivieren.

Kingargyle
quelle
Ich versuche das Gleiche zu tun, um die Erweiterung des Elements zu animieren, aber wenn Sie notifyItemChanged im Adapter aufrufen, blinkt das Element nach der Änderung (Animation funktioniert)! Wie verhindern Sie das?
Flyview
Für unseren Anwendungsfall haben wir unseren benutzerdefinierten Code mithilfe von animateOnLayoutChange ausgetauscht, um ein erweiterbares Layout zu verwenden. Es erreicht dasselbe, was wir versucht haben, aber viel flexibler. github.com/chuross/expandable-layout
kingargyle
3

Ich dieses Problem lösen , indem parent.addView()inonCreateViewHolder

Das ist mein Code

public MyViewHolder onCreateViewwHolder(ViewGroup parent, int viewType)  {
    Button addButton = new Button(context);
    //parent.addView(addButton);
    return new MyViewHolder(addButton);
}

Funktion bei der android.support.v7.widget.RecyclerViewRecycler.recyclerViewHolderinternal()Überprüfung, ob meine Schaltfläche bereits ein übergeordnetes Element hat oder nicht. Wenn wir dem übergeordneten Element eine Schaltfläche hinzufügen, wird diese auch RecyclerViewseiner mParentVariablen zugewiesen .

egon12
quelle
Ich denke, es ist eine neue Anforderung, die ich in Version 24 der Unterstützung der Bibliothek an das übergeordnete Element angehängt habe. Nach der Aktualisierung auf 25 habe ich den Absturz erhalten.
Kirill Kulakov
1

Ich habe gesehen, dass dies für mich passiert ist, als ich ein benutzerdefiniertes Objekt im ViewHolderfür den RecyclerViewAdapter verwendet habe.

Um das Problem zu beheben, habe ich das benutzerdefinierte Objekt, das in meinem Fall ein Timer onViewRecycled(ViewHolder holder)für den Adapter war, wie folgt gelöscht :

    public void onViewRecycled(ViewHolder holder) {
        if(holder instanceof  EntityViewHolder) {
            if(((EntityViewHolder)holder).timer != null) {
                ((EntityViewHolder) holder).timer.cancel();
            }
        }
        super.onViewRecycled(holder);
    }

Dies hat den Fehler behoben.

Androidrp
quelle
1
    /**
     * Informs the recycler whether this item can be recycled. Views which are not
     * recyclable will not be reused for other items until setIsRecyclable() is
     * later set to true. Calls to setIsRecyclable() should always be paired (one
     * call to setIsRecyclabe(false) should always be matched with a later call to
     * setIsRecyclable(true)). Pairs of calls may be nested, as the state is internally
     * reference-counted.
     *
     * @param recyclable Whether this item is available to be recycled. Default value
     * is true.
     *
     * @see #isRecyclable()
     */
    public final void setIsRecyclable(boolean recyclable) {
        mIsRecyclableCount = recyclable ? mIsRecyclableCount - 1 : mIsRecyclableCount + 1;
        if (mIsRecyclableCount < 0) {
            mIsRecyclableCount = 0;
            if (DEBUG) {
                throw new RuntimeException("isRecyclable decremented below 0: " +
                        "unmatched pair of setIsRecyable() calls for " + this);
            }
            Log.e(VIEW_LOG_TAG, "isRecyclable decremented below 0: " +
                    "unmatched pair of setIsRecyable() calls for " + this);
        } else if (!recyclable && mIsRecyclableCount == 1) {
            mFlags |= FLAG_NOT_RECYCLABLE;
        } else if (recyclable && mIsRecyclableCount == 0) {
            mFl`enter code here`ags &= ~FLAG_NOT_RECYCLABLE;
        }
        if (DEBUG) {
            Log.d(TAG, "setIsRecyclable val:" + recyclable + ":" + this);
        }
    }
ZhangTengyuan
quelle
1

1 :remove: Daten aus der Liste entfernen.

2 、notifyDataSetChanged: notifyDataSetChanged ();

3 notifyItemRemovedanimation : Animation anzeigen.

4 、notifyItemRangeChanged: Größe der Bereichsansicht und Neuzeichnen derviewHolders(onBindViewHolder methods)

ZhangTengyuan
quelle
Ich habe getan, notifyItemRemovedwenn das Entfernen footerund App abstürzt, ändern Sie es in notifyDataSetChangedund jetzt funktioniert es in Ordnung. danke
Siarhei
1

In meinem Fall habe ich das verwendet, TransitionManager.beginDelayedTransition()bevor ich eine Ansicht über der recyclerView hinzugefügt habe. Ich habe das entfernt TransitionManager.beginDelayedTransition()und keinen Absturz.

Hai nguyen thanh
quelle
1

Ich habe dieses Problem durch einen Anruf gelöst

setHasStableIds(true);

im Konstruktor des Adapters und Überschreiben getItemIdim Adapter:

@Override
public long getItemId(int position) {
    return position;
}
Kilian Batzner
quelle
1

android:animateLayoutChanges="true"Aus der Recyclingansicht entfernen oder einstellenandroid:animateLayoutChanges="false"

Rajesh Nasit
quelle
0

ich benutze com.squareup.picasso.RequestCreator

public void into(android.widget.ImageView target,
             Callback callback)

Zum dynamischen Ändern der Größe von ImageView nach dem Herunterladen von Bildern aus dem Internet und Speichern der Größe und Höhe der Größe, um die Ansichtsgröße beizubehalten. Ich habe diese Ausnahme erhalten, weil ich sie LayoutParamsin a gespeichert Mapund in meinem onBindViewHolder abgerufen und direkt auf meine gesetzt habe ImageView. Ich ImmutablePair<Integer, Integer>behebe dies, indem ich nur die Größe von ImageView und nicht viele andere Zustände speichere und den folgenden Code verwende, um sie wiederherzustellen.

ViewGroup.LayoutParams params = image.getLayoutParams();
params.width = widthAndHeight.getLeft();
params.height = widthAndHeight.getRight();
image.setLayoutParams(params);
cmicat
quelle
0

Für mich der gleiche Fehler, der durch eine LayoutTransition auf einer übergeordneten ViewGroup verursacht wurde.

Mattlaabs
quelle
0

Lassen Sie mich bitte eine weitere mögliche Lösung für diese Art von Problem hinzufügen. Ich hatte das gleiche Problem mit der superSlim- Bibliothek für klebrige Header in RecyclerView. ich benutzteMatrixCursor Daten auf gesetzt RecyclerViewCursorAdapter. Der Grund für dieses Problem war, dass ID-Spalten 0für alle Header gleich sind. Hoffe, das würde jemandem helfen, ein paar Tage Debugging zu sparen.

MistaGreen
quelle
0

In meinem Fall lag das Problem an der fehlerhaften Implementierung dieser Methode public long getItemId(int position)(überschrieben vonRecyclerView.Adapter Methode).

Der alte Code erhält zwei verschiedene IDs für dasselbe Element (in meinem Fall ist es das Fußzeilenelement), nachdem das Problem behoben wurde.

Mu Sa
quelle
0

Problemumgehungslösung, wenn der Grund für die Ausnahme das übergeordnete Element von itemView ist. Entfernen Sie im Code, in dem Sie notifyItemRemoved (Position) haben, itemView aus RecyclerView:

View itemView = mRecyclerView.getLayoutManager().findViewByPosition(position);
if (itemView != null && itemView.getParent() != null) {
    ((ViewGroup) itemView.getParent()).removeView(itemView);
}
notifyItemRemoved(position);
Polurival
quelle
0

Ein besonderer Fall, der für mich auftrat, war, dass ich ein Ansichtsmitglied im Adapter hatte und faul war, eine Ansicht zu instanziieren, die mit der Recyclingansicht nicht zu tun hat.

Dies verstößt auch gegen die Prinzipien der Recycling-Ansichten, die in diesem Fall als Speicherung eines Verweises auf die Ansicht dienen. Ich gebe ein kurzes Beispiel unten:

// typically we would do this in a grid view adapter:
View v;
// ...
if(v = null){
v = LayoutInflater.inflate ...;
}

// Now with recycle view there is NO need to store a reference to View
// and lazy instantiate. So get rid of your View v member
Jonny2Plates
quelle
0

Diese Ausnahme ist nicht Ursache von

android: animateLayoutChanges

oder

android: focusableInTouchMode

Diese endgültige richtige Antwort ist nur, weil Sie ein FALSCHES LayoutParams festgelegt haben .

    nameLP = new LinearLayout.LayoutParams(context.getResources().getDisplayMetrics().widthPixels, LinearLayout.LayoutParams.WRAP_CONTENT);
    nameLP2 = new RecyclerView.LayoutParams(RecyclerView.LayoutParams.MATCH_PARENT, RecyclerView.LayoutParams.WRAP_CONTENT);

Der Name LP ist OK. Der Name LP2 tritt auf, wenn der Absturz .bug hier ist.

Ich versuche alle Antworten dieser Seite. Vertrau mir.

evin
quelle
0

Ich hatte dieses Problem , weil ich überschreiben equals()und hashcode()Verfahren ViewHoldervon RecyclerView.ViewHolder durch Datengleichheit Berechnung und hashcode, dann ist die Recycling - Logik hat nicht funktioniert und abgestürzt, ich entfernen Sie einfach das Überschreiben und fixiert.

Irwin
quelle