从ArrayAdapter获取所有项目

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

1.保持对支持List的引用

像这样创build适配器:

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

然后只需将items或其副本传递给下一个活动。

我看到这个缺点是,我依靠的是无证的事实,即我传递给构造函数的同一列表包含后面的项目。

2.通过适配器迭代

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

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

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

我有点迟到了,但是我遇到了类似的问题。

处理#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; } } 

与此同时解决的办法是不使用ArrayAdapter 。 在这种情况下,如果你使用这个API,看起来好像只使用function较less的(和复杂的) BaseAdapter 。 在本文中,您可以阅读更多关于使用BaseAdapter而不是ArrayAdapter的决定: Android Adapter Good Practices 。

一个快速testing说,方法1的作品。 它看起来是最快最干净的,但由于它没有logging,所以您可能希望在预期的平台上进行testing,以及在ArrayAdapter的基础结构发生变化时进行更新。

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

最好的方法是“保持对列表的引用”,但不传递“items”variables/参数给构造器:

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

这样你只能将ArrayList实例化为一个空的数组,你将不得不自己pipe理你的列表。

我认为第一种方法是做到这一点的最好方法。

我不认为,数据将是另一个活动的原始。 因为你可以通过捆绑传递物品,所以对象首先被写在捆绑上,然后在从捆绑中读取的下一个活动中。

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