2017-02-13 109 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

很高兴帮助,你可以标记我的答案,如果它帮助:) –