ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

android – 在RecyclerView.ViewHolder中添加片段

2019-06-27 20:11:00  阅读:252  来源: 互联网

标签:android android-fragments android-viewholder


我有一个RecyclerView.ViewHolder,它将根据传递的对象的实例将不同的片段添加到其FrameLayout中.问题出在几乎不可能将片段添加到ViewHolder中.请注意,我已经从父级传递了FragmentManager.最初我尝试使用此代码

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)

我的猜测是,由于ViewHolder模式,id在某些时候发生冲突,或者视图被破坏了.所以我的问题是.

1)有没有解决方法?

2)有没有比添加片段更好的做法.我添加片段的原因是,ViewHolder子项的逻辑都可以位于单个片段中.当然,我可以将片段的两个视图放入ViewHolder xml中.并且只是setVisible()取决于条件.但这只会让我的ViewHolder包含太多逻辑.

如果有人感到困惑,为什么我需要片段.这就是我想要实现的目标.
The image

解决方法:

简短的回答:你不应该在recyclerView中使用片段,这不是他们的目的.

答案很长:here

标签:android,android-fragments,android-viewholder
来源: https://codeday.me/bug/20190627/1308274.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有