我有一個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
您不使用具有recyclerview的片段。您可能需要使用[ViewPager](https://developer.android.com/reference/android/support/v4/view/ViewPager.html) –
對於解決方法,您可以在視圖持有者中添加一個FrameLayout以獲取一個Id。通常,我們通過擴展RecyclerView.Adapter來使用適配器。 –
jdesesquelles
我有一個項目列表。根據對象的實例,該項目的ViewHolder的底部部分是不同的。這就是爲什麼我使用片段。他們全部共享相同的頂部。 – Ginsan