我有一个由ListFragment
支持的ArrayAdapter
由Loader
填充。当用户点击其中一个项目时,我想将对所选项目的引用以及列表项目的其余部分传递给另一个片段。我的问题是如何从适配器获取所有项目?以下是我看到的可能性:
1。请引用后备List
像这样创建适配器:
List<DomainObject> items = new ArrayList<DomainObject>();
listAdapter = new ArrayAdapter<DomainObject>(getActivity(), R.layout.mine, items);
然后只需将items
或其副本传递给下一个活动。
我看到的缺点是我依赖于未记录的事实,即我传递给构造函数的相同列表稍后会包含这些项目。
2。通过适配器迭代
单击某个项目时,请遍历适配器并构建列表。这似乎是一项不必要的工作量。这些项目包含在适配器的List
中,我手动将每个项目复制到新列表。
第3。添加到适配器
时,请保留单独的项目列表在将项添加到适配器之前,将其添加到我在片段中维护的单独列表中。这也是浪费,因为项目列表被复制到ArrayAdapter
和片段。
答案 0 :(得分:32)
我比赛有点晚了,但是我遇到了类似的问题。
处理#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;
}
}
答案 1 :(得分:7)
我在此期间解决的解决方案就是不使用ArrayAdapter
。如果你正在与这个API作斗争,那么使用功能较少(和复杂)BaseAdapter
似乎更好。您可以在本文中详细了解有关BaseAdapter
而不是ArrayAdapter
的决定:Android Adapter Good Practices。
答案 2 :(得分:0)
快速测试表明方法1有效。它似乎是最快和最干净的,但由于它没有文档,你可能希望在预期的平台上测试它,并且只要它们更新,以防ArrayAdapter的底层结构发生变化。
我使用的是编译SDK版本22和最低版本的SDK版本。
答案 3 :(得分:0)
最好的方法是&#34;保持对List&#34;的引用。但没有通过&#34;项目&#34;构造函数的变量/参数:
List<DomainObject> items = new ArrayList<DomainObject>();
listAdapter = new ArrayAdapter<DomainObject>(getActivity(), R.layout.mine);
通过这种方式,您只能将ArrayList实例化为空数组,并且您必须自己管理您的列表。
答案 4 :(得分:-2)
我认为第一种方法是最好的方法。
我不认为,数据将是另一个活动的原创。因为,你会通过bundle传递项目,所以首先在bundle上写入对象,然后在bundle中读取的下一个Activity中。
但是,如果您使用其他方式传递列表,请使用list.clone()
创建新对象,而不是传递原始对象。