如中,ListView 的 ELEMENTS 可以是 Fragments。我知道您可以将 TextView XML 分配给 ListView 以更改其外观,但是您可以将 Fragments 添加到 ListView 中。
例如:我有一个片段。所述片段的 XML 包含一个 ImageView、几个大样式的 TextView 和一个小样式的 TextView。Fragment 类代码接收一个 Bundle,然后根据内容相应地填充 TextViews 和 ImageView。片段 XML 和片段代码都可以正常工作(我可以很好地显示单个片段)。我有一个 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);
这是我对此的思考方式。我制作了一个 ArrayList of Fragments 来保存我所有的实例化视图。然后我创建一个 Fragment,创建一个 Bundle,将数据添加到 Bundle(以便 Fragment 可以正确地将数据编组到它的视图中),将 Bundle 添加到 Fragment,最后将 Fragment 添加到 ArrayList。之后,我制作了一个 ArrayAdapter,添加了我想要使用的元素布局,以及我制作的片段列表;然后将 ListView 设置为从我的适配器中读取。
运行此代码的任何人都可能会得到 NPE @ 实例化 ArrayAdapter。是什么赋予了?这甚至可能吗?在我一直为此绞尽脑汁之前,有人能告诉我我是不是在浪费时间吗?有没有更好的办法?我一直在考虑使用 ScrollView,但是 ListView 的很多功能都需要重新实现,而且我讨厌-讨厌-讨厌在没有必要时重新发明轮子。
感谢任何阅读的人,特别是如果您决定离开他们,请特别感谢您的想法。我已经尝试过寻找一个既定的答案,但我似乎找到的只是关于在片段内部使用 ListView 的问题/网页;不使用片段作为 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) c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
return i.inflate(R.layout.tile_item, vg, false);
}
}
这就是我如何实现它:
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);
AdapterItem adapter = new AdapterItem(this, fragList);
adapter.add(fragment);
listItems.setAdapter(adapter);
所以已经有几天了,我很确定这个线程已经被埋没了。但是,我想我会添加最后一个更新,以防有人想尝试这个并且谷歌搜索将他们带到这里。所以在我的实现中,当给 ListView 适配器时,我得到了一个 NPE。不需要火箭外科医生就可以确定它肯定是适配器而不是 ListView 抛出错误。对于我的生活,我无法弄清楚为什么......
无论如何,我想我有一些想法。首先,来个小故事:不久前,我试图在 FragmentDialog 中创建 FragmentTransactions。每次我尝试这样做时,我都会得到一个 NPE。最终,通过大量研究,我发现原因与 Fragments 的实例化方式有关。调用 Fragment 时,它需要来自其父级的上下文。由于 Dialog 的父级是启动它的 Activity,因此 Dialog 本身不符合必要的条件。我相信,在尝试将片段添加到 ListView 时,情况也是如此。由于 ListView 不符合实例化 Fragment 的协议,它会抛出 NPE,因此让我挂起并回到约定。D@mn...我真的希望我能够做到这一点。使用片段而不是简单的 XML 会使组织/搜索列表变得更加容易。哦,好吧......如果有人想知道,我猜它不能完成。