2017-02-13 84 views
1

我有一個RecyclerView.ViewHolder,它會根據傳遞的對象的實例將不同的片段添加到它的FrameLayout中。問題出現在向ViewHolder添加片段幾乎不可能的地方。請注意,我已經從父級傳遞了FragmentManager。起初,我嘗試使用此代碼在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(); 
    } 
} 

的問題與此代碼是所有ViewHolder共享相同的ID,因此只有一個ViewHolder可以添加片段。在我的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,發生了運行時錯誤

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) 

我的猜測是哪個國家,要麼將ID衝突在某些時候,或者認爲得到了因銷燬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以獲取一個Id。通常,我們通過擴展RecyclerView.Adapter來使用適配器。 jdesesquelles

+0

我有一個項目列表。根據對象的實例,該項目的ViewHolder的底部部分是不同的。這就是爲什麼我使用片段。他們全部共享相同的頂部。 – Ginsan

回答

1

簡短的回答:你不應該在recyclerView中使用片段,這不是他們的目標。

長答案:here

+0

也許你是對的。使用片段是一個糟糕的設計。謝謝你的回答 – Ginsan

+0

很高興幫助,你可以標記我的答案,如果它幫助:) –