Add fragment in RecyclerView.ViewHolder

Ich habe eine RecyclerView.ViewHolder die verschiedenen fragment in seine FrameLayout basierend auf der Instanz des Objekts übergeben. Das problem kommt, wo es fast unmöglich ist, hinzufügen-fragment in den ViewHolder. Beachten Sie, dass ich bereits an der FragmentManager von den Eltern. Zunächst versuche ich es mit diesem code

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 bei diesem code ist, dass alle die ViewHolder teilen sich die gleiche id, so dass nur eine einzige ViewHolder hinzufügen können, das fragment. In meinem RecyclerView, nur die erste Zelle Hinzugefügt, das fragment. Um diesem problem zu begegnen, erstelle ich ein weiteres FrameLayout und fügen Sie ihn in typeContainerLayout. Jetzt ist mein code geworden.

public void setSomething(boolean A) {
    FrameLayout frameLayout = new FrameLayout(mContext);
    frameLayout.setId(View.generateViewId());
    mBinding.typeContainerLayout.removeAllViews();
    mBinding.typeContainerLayout.addView(frameLayout)

    if (A) {
         mFragmentManager.beginTransaction()
            .replace(frameLayout.getId(), new FragmentA())
            .commit();
    } else {
        mFragmentManager.beginTransaction()
            .replace(frameLayout.getId(), new FragmentB())
            .commit();
    }
}

Nun jeder ViewHolder hat Hinzugefügt, dass das fragment korrekt und hat Ihren eigenen fragment. Aber das problem kommt, wenn ich Hinzugefügt, wie 5 ViewHolder und versuchen, einen Bildlauf nach unten die RecyclerView, ein runtime-Fehler aufgetreten, welcher Staat

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-Konflikt an einem gewissen Punkt, oder die Ansicht zerstört wurden durch das ViewHolder-pattern. Also meine Frage ist.

1) gibt es irgendeine Abhilfe?

2) gibt es eine bessere Praxis, als fragment. Der Grund warum ich das add fragment ist so, dass die Logik der Unterpunkt der ViewHolder-Sie alle können sich in einem einzelnen fragment. Natürlich kann ich einfach beide Ansichten für die Fragmente in den ViewHolder xml. Und nur setVisible-Methode() je nach Zustand. Aber das wird nur meine ViewHolder enthalten zu viele Logik.

Den Fall, dass jemand verwirrt ist, warum ich brauche fragment. Dies ist, was ich versuche zu erreichen.
Das Bild

Verwenden Sie keine Fragmente mit recyclerview. Sie wahrscheinlich benötigen, um ViewPager
Für die Arbeit rund um, Sie können hinzufügen, ein FrameLayout in der anzeigen-Halter bekommen eine Id. In der Regel verwenden wir-Adapter durch die Ausweitung der RecyclerView.Adapter<RecylcerView.ViewHolder>
Ich habe eine Liste von Elementen. Abhängig von der Instanz des Objektes, der untere Teil der ViewHolder für die Sache anders aus. Thats, warum ich verwendet, fragment. Alle von Ihnen teilen die gleichen top-Teil.
jdesesquelles, habe ich alle diese Adapter code korrekt funktioniert bereits. Nur die ViewHolder Teil. Ich habe das hinzufügen von FrameLayout Ding und ich bekomme die IllegalArgumentException
Man könnte auch festlegen, sichtbar und blenden Sie die corresdonding element des Elements layout-abhängig von der Art der Elemente ? Wenn die ViewHolder Klasse ist innerhalb des Adapters, die extra Logik ist immer noch in den adapter.

InformationsquelleAutor Ginsan | 2017-02-13

Schreibe einen Kommentar