2017-02-13 7 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 разделяют тот же идентификатор, что только один 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

+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

Рад помочь, вы можете отметить мой ответ, если это помогло :) –