2017-02-13 14 views
1

私はRecyclerView.ViewHolderを持っています。これは渡されたオブジェクトのインスタンスに基づいて異なるフラグメントをFrameLayoutに追加します。この問題は、ViewHolderにフラグメントを追加することがほとんど不可能な場合に起こります。私はすでに親からFragmentManagerを渡したことに注意してください。当初、私はこのコードの問題は、すべてのViewHolderが同じIDを共有し、これだけの単一ViewHolderがフラグメントを追加することができるということです。このコードRecyclerView.ViewHolderでフラグメントを追加

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(); 
    } 
} 

てみてください。私のRecyclerViewでは、最初のセルだけがフラグメントを追加しました。この問題に取り組むために、別のFrameLayoutを作成し、typeContainerLayoutに追加します。これで私のコードはこうなります。

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(); 
    } 
} 

ここで、各ViewHolderはフラグメントを正しく追加し、独自のフラグメントを持っています。しかし、問題は、私は5 ViewHolderのように追加したときに来て、RecyclerViewを下にスクロールしようとすると、実行時エラーが私の推測では、いくつかの点でいずれかのIDが競合していることである、またはビューが起因して破壊されてしまった状態

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) 

発生しましたViewHolderパターンだから私の質問はそれです。

1)回避策はありますか?

2)フラグメントを追加するよりも優れた方法がありますか?フラグメントを追加するのは、ViewHolderのサブアイテムのロジックをすべて単一のフラグメントに配置できるようにするためです。もちろん、フラグメントのビューの両方をViewHolder xmlに入れることができます。条件に応じてsetVisible()を実行するだけです。しかし、それは単に私のViewHolderにあまりに多くのロジックが含まれるようにします。

誰かが混乱している場合、私はなぜフラグメントが必要なのでしょうか。これが私が達成しようとしていることです。 The image

+1

recyclerviewでフラグメントを使用しません。 [ViewPager](https://developer.android.com/reference/android/support/v4/view/ViewPager.html)を使用する必要があります。 –

+0

回避策として、FrameLayoutをビューホルダーに追加してイド。通常は、RecyclerView.Adapter を拡張してアダプタを使用します。 – jdesesquelles

+0

アイテムのリストがあります。オブジェクトのインスタンスによっては、項目のViewHolderの下部が異なります。なぜ私は断片を使用したのですか?それらのすべてが同じトップ部分を共有します。 – Ginsan

答えて

1

短い答え:リサイクラビュー内でフラグメントを使用しないでください。これは意図したものではありません。

長い回答:here

+0

あなたが正しいかもしれません。フラグメントを使用するのは悪い設計です。お返事ありがとうございます – Ginsan

+0

お手伝いしてうれしい場合は、私の答えをマークすることができます:) –

関連する問題