相关疑难解决方法(0)

ListView可以包含片段

如在,ListView的ELEMENTS可以是片段.我知道您可以将TextView XML分配给ListView以更改其外观,但是您可以将片段添加到ListView中.

例如:我有一个片段.所述片段的XML包含一个ImageView,一些大型TextView和一个小型TextView.Fragment类代码接收Bundle,然后根据内容相应地填充TextViews和ImageView.Fragment XML和Fragment代码都可以正常工作(我可以很好地显示单个Fragment).我有一个FragmentActivity,我想在其中显示上面提到的碎片列表.这是我用来尝试填充FragmentActivity视图中的ListView的代码:

    ArrayList<Fragment> fragList = new ArrayList<Fragment>();
    Fragment fragment = Fragment.instantiate(this, TileItem.class.getName());
    Bundle bundle = new Bundle();
    bundle.putInt("key", 0);
    fragment.setArguments(bundle);
    fragList.add(fragment);

    ArrayAdapter<Fragment> adapter = new ArrayAdapter<Fragment>(this, R.layout.tile_item, fragList);
    listItems.setAdapter(adapter);
Run Code Online (Sandbox Code Playgroud)

这是我对此的思考方式.我创建了一个Fragments的ArrayList来保存我所有实例化的视图.然后创建一个片段,创建一个包,将数据添加到包(这样的片段可以正确地封送数据到它的意见),加上捆绑的片段,然后最后片段添加到ArrayList.之后,我创建一个ArrayAdapter,添加我想要使用的元素布局,以及我制作的片段列表; 然后将ListView设置为从我的适配器读取.

任何运行此代码的人都可能会获得NPE @实例化ArrayAdapter.是什么赋予了?这甚至可能吗?在我继续绞尽脑汁之前,有人可以告诉我,如果我只是在浪费时间吗?有没有更好的办法?我一直在想用滚动型的,但这么多的ListView的功能将需要重新实现,我讨厌恨,恨重复发明轮子时,它不是必需的.

感谢所有人的阅读,特别感谢您的决定,如果您决定离开他们.我试图寻找一个既定的答案,但我似乎找到的是关于使用片段的Lis​​tView INSIDE的问题/网页; 不使用碎片作为ListView的元素

编辑:我接受了以下建议,并开始调查更多.从事情出现,我应该能够使用该膨胀片段,而不是从XML只是平了建筑的自定义接口的方式(因为缺乏一个更好的方式来描述这一过程),但我目前的实现正试图设置时抛出NPE适配器.

这是我的自定义适配器代码(为简洁起见缩短):

public class AdapterItem extends ArrayAdapter<Fragment> {

Context c;
List<Fragment> f;

public AdapterItem(Context c, List<Fragment> f) {
    super(c, R.layout.tile_item, f);
    this.c = c;
    this.f = f;
}

@Override
public View getView(int pos, View v, ViewGroup vg) {
    LayoutInflater i = (LayoutInflater) …
Run Code Online (Sandbox Code Playgroud)

android listview fragment android-arrayadapter

39
推荐指数
2
解决办法
2万
查看次数

在RecyclerView.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();
    }
}
Run Code Online (Sandbox Code Playgroud)

这段代码的问题是所有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();
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,每个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 …
Run Code Online (Sandbox Code Playgroud)

android android-fragments android-viewholder

10
推荐指数
2
解决办法
1万
查看次数