gpt4 book ai didi

android - ListView 可以包含 fragment 吗

转载 作者:IT王子 更新时间:2023-10-29 00:09:50 25 4
gpt4 key购买 nike

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

例如:我有一个 fragment 。所述 fragment 的 XML 包含一个 ImageView、几个大样式的 TextView 和一个小样式的 TextView。 Fragment 类代码接收一个 Bundle,然后根据内容相应地填充 TextViews 和 ImageView。 fragment XML 和 fragment 代码都可以正常工作
(我可以很好地显示一个单独的 fragment )。我有一个 FragmentActivity,我想在其中显示上述 fragment 列表。这是我用来尝试在 FragmentActivity 的 View 中填充 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 来保存我所有的实例化 View 。然后我创建一个 Fragment,创建一个 Bundle,将数据添加到 Bundle(以便 Fragment 可以正确地将数据编码到它的 View 中),将 Bundle 添加到 Fragment,最后将 Fragment 添加到 ArrayList。之后,我制作了一个 ArrayAdapter,添加了我想要使用的元素布局,以及我制作的 fragment 列表;然后将 ListView 设置为从我的适配器中读取。

运行此代码的任何人都可能会得到 NPE @ 实例化 ArrayAdapter。是什么赋予了?这甚至可能吗?在我一直为此绞尽脑汁之前,有人能告诉我我是不是在浪费时间吗?有没有更好的办法?我一直在考虑使用 ScrollView,但是 ListView 的很多功能都需要重新实现,我讨厌-讨厌-讨厌在没有必要时重新发明轮子。

感谢任何阅读的人,特别是如果您决定离开他们,请特别感谢您的想法。我已经尝试过寻找一个既定的答案,但我似乎找到的只是关于在 fragment 内部使用 ListView 的问题/网页;不使用 fragment 作为 ListView 的元素

编辑:我接受了以下建议并开始进行更多调查。从事情出现的方式来看,我应该能够使用一个自定义适配器来膨胀 fragment ,而不是仅仅从 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 本身不符合必要的条件。我相信,在尝试将 fragment 添加到 ListView 时,情况也是如此。由于 ListView 不符合实例化 Fragment 的协议(protocol),因此它会抛出 NPE,因此让我悬而未决并回到约定。 D@mn...我真的希望我能够做到这一点。使用 fragment 而不是简单的 XML 会使组织/搜索列表变得更加容易。哦,好吧......如果有人想知道,我猜它不能完成。

最佳答案

我想说这是不可能的,因为将 fragment 放入 ListView 意味着 fragment 可以在多个容器中相乘。当您使用 FragmentManager 创建 fragment 时,会使用标识符对其进行标记,从而可以轻松地重新加载和重新排列方向和其他配置更改。它还鼓励跨多个设备配置使用。

fragment 实际上是 Activity 的子集。您是否将 Activity 作为列表的一部分?绝对不是(应该是答案!)!!!

此外,在 fragment 移入和移出 View 时连续附加()和分离() fragment 并不是很有用(单元格被回收)。这些都是 ListView 不应该处理的昂贵操作。列表应该快速滚动。

从评论的对话中,我可以看出您希望通过在 Activity 中很好地分离 View 设置代码和适配器来实现漂亮的代码。这样做:

  • 覆盖 View上课并在那里进行自定义绘图和设置。
  • 创建一个新类,在其中提供所需的上下文和数据集,以使您返回列表需要显示的 View ——这是我通常做的。
  • 有一个 Utils 类在其他地方构建您的视频(愚蠢)。

  • 只是不要在列表中使用 fragment 。不是他们的目标用例。 HTH。

    关于android - ListView 可以包含 fragment 吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11363309/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com