У меня есть 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 разделяют тот же идентификатор, что только один 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)
Я думаю, что либо идентификатор противоречили в какой-то момент, или вид был разрушен из-за шаблон ViewHolder. Так что мой вопрос в том, что.
1) Есть ли обходной путь к нему?
2) Есть ли более эффективная практика, чем добавление фрагмента. Причина, по которой я добавляю фрагмент, заключается в том, что логика для подэлемента ViewHolder может быть размещена в одном фрагменте. Конечно, я могу просто поместить оба представления для фрагментов в XML-файл ViewHolder. И просто setVisible() в зависимости от условия. Но это просто заставит мой ViewHolder содержать слишком много логики.
В случае, если кто-то смущен, почему мне нужен фрагмент. Это то, чего я пытаюсь достичь. The image
Вы не использовать фрагменты с recyclerview. Вероятно, вам нужно использовать [ViewPager] (https://developer.android.com/reference/android/support/v4/view/ViewPager.html) –
. Для работы вы можете добавить FrameLayout в держатель вида, чтобы получить Id. Обычно мы используем адаптеры, расширяя RecyclerView.Adapter –
jdesesquelles
У меня есть список элементов. В зависимости от экземпляра объекта нижняя часть ViewHolder для элемента отличается. Вот почему я использовал фрагмент. Все они имеют одну и ту же верхнюю часть. – Ginsan