19

我有一个由 aListFragment支持的ArrayAdapter,由 a 填充Loader。当用户单击其中一个项目时,我想将对所选项目以及列表项的其余部分的引用传递给另一个片段。我的问题是我应该如何从适配器中获取所有项目?以下是我看到的可能性:

1.保留对支持的引用List

像这样创建适配器:

List<DomainObject> items = new ArrayList<DomainObject>();
listAdapter = new ArrayAdapter<DomainObject>(getActivity(), R.layout.mine, items);

然后简单地将其传递items或复制到下一个活动。

我看到的缺点是我依赖于未记录的事实,即我传递给构造函数的同一个列表包含稍后的项目。

2. 遍历适配器

单击项目时,遍历适配器并建立列表。这似乎是不必要的工作量。这些项目包含在List适配器中,我手动将每个项目复制到一个新列表中。

3.添加到适配器时保留单独的项目列表

在将项目添加到适配器之前,将其添加到我在片段中维护的单独列表中。这也是浪费的,因为项目列表被复制到ArrayAdapter和片段中。

4

5 回答 5

36

我玩游戏有点晚了,但我遇到了类似的问题。

处理 #1 的一种方法是在 的子类中维护对列表的引用ArrayAdapter,以便您的重用由适配器对象控制。

就像是:

public class DomainAdapter extends ArrayAdapter<DomainObject> {

    private final List<DomainObject> items;

    public DomainAdapter(Context context, List<DomainObject> items) {
        super(context, R.layout.mine, items);
        this.items = items;
    }

    public List<DomainObject> getItems() {
        return items;
    }
}
于 2013-03-12T14:23:05.230 回答
8

我在此期间采用的解决方案就是不使用ArrayAdapter. 在您与此 API 作斗争的情况下,似乎最好只使用功能不太全面(且复杂)BaseAdapter的 。您可以阅读更多关于决定使用的信息,BaseAdapter而不是ArrayAdapter在这篇文章中:Android Adapter Good Practices

于 2013-06-16T23:25:39.737 回答
0

快速测试表明方法 1 有效。它似乎是最快和最干净的,但由于它没有记录,您可能希望在预期的平台上测试它,并在它们更新时进行测试,以防 ArrayAdapter 的底层结构发生变化。

我正在使用编译 SDK 版本 22 和最小 SDK 版本 10。

于 2015-08-05T03:39:54.400 回答
0

最好的方法是“保留对列表的引用”但不将“项目”变量/参数传递给构造函数:

List<DomainObject> items = new ArrayList<DomainObject>(); listAdapter = new ArrayAdapter<DomainObject>(getActivity(), R.layout.mine);

这样,您只需将 ArrayList 实例化为一个空数组,您必须自己管理您的列表。

于 2016-06-20T09:00:12.900 回答
-2

我认为第一种方法是最好的方法。

我不认为,数据将是另一个活动的原始数据。因为,你会通过bundle传递项目,所以对象首先写在bundle上,然后在我们从bundle读取的下一个Activity中。

但是,如果您使用其他方式传递列表,请使用list.clone()创建新对象,而不是传递原始对象。

于 2012-07-25T13:07:15.317 回答