【发布时间】:2012-07-06 23:28:04
【问题描述】:
如上,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 会使组织/搜索列表变得更加容易。哦,好吧……如果有人想知道的话,这可能是不可能的。
【问题讨论】:
-
为什么你甚至想要片段成为“ListView的元素”?开发人员多年来一直在创建
ListViews,但他们的元素并未成为片段。您希望通过将它们变成碎片获得什么? -
好吧,我希望能够在列表中显示的不仅仅是一个简单的 TextView(实际上我将能够显示一个图像和几行额外的文本) .此外,我将能够反复重用来自不同活动的片段代码,而无需重复代码。我还看到了比简单的 TextView 更动态的项目滚动列表(如 Google Play 中的列表,它们比 TextView 更复杂)。这是如何实现的?使用 Fragment 会不会产生同样的效果(更简单)?
-
您可以通过使用自定义适配器和从 XML 为您的行膨胀的视图来做到这一点。
-
我喜欢这个替代方案,但是它将我用于实例化这些视图的所有代码都放在了托管 ListView 的活动中。如果这些视图在片段中出现错误,那么所有代码都在片段中。您是否有可以处理此问题的自定义适配器示例?我可以在它自己的类中扩展适配器,从而将所有用于实例化这些视图的代码保留在一个位置吗?
-
"使用 Fragment 不是可以实现相同的效果(更简单)吗?" -- 好吧,考虑到我所知道的没有人在
ListView中使用片段作为元素,这肯定不太容易。在没有碎片的情况下做到这一点是微不足道的。现在,您当然可以通过检查PagerAdapter和FragmentPagerAdapter之间的相似关系来制作一个由片段支持的ListAdapter。但是,您正在开辟新天地,尚不清楚是否需要这样做。
标签: android listview android-arrayadapter fragment