2012-07-25 57 views
14

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

1.保持一个参考后盾List

创建适配器像这样:

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

,然后简单地传递items或它的一个副本到下一个活动。

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

2.迭代通过适配器

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

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

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

回答

7

的解决方案,我在此期间旷古只是不使用ArrayAdapter。如果您正在与此API作斗争,似乎最好使用不太全面(且复杂)的BaseAdapter。您可以阅读更多关于BaseAdapter而不是ArrayAdapter在本文中的决定:Android Adapter Good Practices

+0

虽然这篇文章大多是好的,但我会忽略他的整个线程安全部分。他完全错误地假设为什么会有锁(由于在后台线程中发生过滤),并且如果在除UI线程之外的任何其他任何情况下调用notifyDataSetChanged(),则ArrayAdapter已经崩溃。 – 2014-12-09 01:04:34

+0

@ scompt.com我认为你发布的链接是错误的解释ArrayAdapter。这似乎只解释了ArrayAdapter 。我有点困惑... – theMfromA 2015-06-12 08:49:38

+0

从您链接的页面...“只能显示文字。” =>错了。 “强制您提供CharSequence项目列表...”=>错误“要求您提供仅包含TextView”的布局资源=>错误。几乎所有的假设都是错误的...我不是说ArrayAdapter比BaseAdapter更好,但基本知识是错误的。 – Loenix 2016-08-12 09:20:08

-2

我觉得第一种方法是做到这一点的最佳方法。

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

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

27

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

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

注意。如果您打算在某个时候过滤适配器,则此方法有可能失败。在ArrayAdapter内部执行过滤器将创建List的全新实例。这意味着你的外部定义的“项目”将不再是相同的列表。这意味着如果稍后进行了修改,它将会失去同步。你可以在这里阅读更多关于它:http://www.jaysoyer.com/2014/07/constructor-woes-androids-arrayadapter/ – 2014-12-09 00:59:48

0

快速测试表明方法1有效。它看起来是最快最干净的,但由于它没有记录,所以您可能希望在预期的平台上进行测试,以及在ArrayAdapter的基础结构发生变化时进行更新。

我使用SDK编译版本22和分钟SDK版10.

0

最好的方法是“保持的列表的参考”,而不是通过“项目”变量/参数的构造:

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

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