2017-02-13 23 views
1

Ich habe einen RecyclerView.ViewHolder, der basierend auf der Instanz des übergebenen Objekts ein anderes Fragment in sein FrameLayout einfügt. Das Problem tritt dort auf, wo es fast unmöglich ist, Fragmente in den ViewHolder einzufügen. Beachten Sie, dass ich den FragmentManager bereits vom übergeordneten Element übergeben habe. Zunächst versuche ich mit diesem CodeFragment in RecyclerView.ViewHolder hinzufügen

public void setSomething(boolean A) { 
    if (A) { 
     mFragmentManager.beginTransaction() 
      .replace(mBinding.typeContainerLayout.getId(), new FragmentA()) 
      .commit(); 
    } else { 
     mFragmentManager.beginTransaction() 
      .replace(mBinding.typeContainerLayout.getId(), new FragmentB()) 
      .commit(); 
    } 
} 

Das Problem mit diesem Code ist, dass alle ViewHolder die gleiche ID teilen, so dass nur ein einziger ViewHolder das Fragment hinzufügen kann. In meinem RecyclerView fügte nur die erste Zelle das Fragment hinzu. Um dieses Problem anzugehen, erstelle ich ein anderes FrameLayout und füge es in typeContainerLayout hinzu. Jetzt wird mein Code so.

Jetzt hat jeder ViewHolder das Fragment korrekt hinzugefügt und hat sein eigenes Fragment. Doch das Problem kommt, wenn ich wie 5 ViewHolder gegeben und versucht, die RecyclerView nach unten zu scrollen, kam es zu einem Laufzeitfehler, welchen Zustand

java.lang.IllegalArgumentException: No view found for id 0x4 (unknown) for fragment FragmentA{7c55a69 #0 id=0x4 FragmentA} 
         at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1292) 
         at android.support.v4.app.FragmentManagerImpl.moveFragmentsToInvisible(FragmentManager.java:2323) 
         at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2136) 
         at android.support.v4.app.FragmentManagerImpl.optimizeAndExecuteOps(FragmentManager.java:2092) 
         at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1998) 
         at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:709) 
         at android.os.Handler.handleCallback(Handler.java:739) 
         at android.os.Handler.dispatchMessage(Handler.java:95) 
         at android.os.Looper.loop(Looper.java:148) 
         at android.app.ActivityThread.main(ActivityThread.java:5417) 
         at java.lang.reflect.Method.invoke(Native Method) 
         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

Meine Vermutung ist, dass entweder die ID an einem gewissen Punkt in Konflikt, oder der Blick wurde aufgrund zerstört das ViewHolder-Muster. Also meine Frage ist das.

1) Gibt es eine Umgehungslösung?

2) Gibt es eine bessere Praxis als das Hinzufügen von Fragment? Der Grund für das Hinzufügen eines Fragments besteht darin, dass die Logik für das Unterelement des ViewHolder alle in einem einzigen Fragment angeordnet sein kann. Natürlich kann ich einfach beide Ansichten für die Fragmente in die ViewHolder-XML-Datei einfügen. Und setze einfach visible() abhängig von der Bedingung. Aber das wird meinen ViewHolder nur dazu bringen, zu viele Logik zu enthalten.

Falls jemand verwirrt ist, warum ich Fragment brauche. Das versuche ich zu erreichen. The image

+1

Sie verwenden keine Fragmente mit recyclerview. Wahrscheinlich müssen Sie [ViewPager] (https://developer.android.com/reference/android/support/v4/view/ViewPager.html) verwenden. –

+0

Für die Arbeit können Sie ein FrameLayout im View Holder hinzufügen eine ID. Normalerweise verwenden wir Adapter, indem wir RecyclerView.Adapter erweitern jdesesquelles

+0

Ich habe eine Liste von Elementen. Abhängig von der Instanz des Objekts unterscheidet sich der untere Teil des ViewHolders für das Element. Deshalb habe ich Fragment verwendet. Alle von ihnen teilen den gleichen oberen Teil. – Ginsan

Antwort

1

Kurze Antwort: Sie sollten keine Fragmente innerhalb einer RecyclerView verwenden, das ist nicht, wofür sie bestimmt sind.

Lange Antwort: here

+0

Vielleicht haben Sie Recht. Es ist ein schlechtes Design, um Fragmente zu verwenden. Danke für die Antwort – Ginsan

+0

Froh zu helfen, können Sie meine Antwort markieren, wenn es geholfen hat :) –

Verwandte Themen