从ArrayAdapter获取所有项目

Edw*_*ale 16 android

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

1.保留对背景的参考 List

像这样创建适配器:

List<DomainObject> items = new ArrayList<DomainObject>();
listAdapter = new ArrayAdapter<DomainObject>(getActivity(), R.layout.mine, items);
Run Code Online (Sandbox Code Playgroud)

然后简单地将其items或副本传递给下一个活动.

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

2.通过适配器迭代

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

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

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

the*_*enp 33

我在比赛中有点迟了,但是我遇到了类似的问题.

处理#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;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 注意.如果您计划在某个时候过滤适配器,则此方法可能会失败.执行过滤器将在ArrayAdapter内部创建List的全新实例.这意味着您外部定义的`items`将不再是同一个列表.这意味着如果稍后进行修改,它将失去同步.你可以在这里阅读更多相关信息:http://www.jaysoyer.com/2014/07/constructor-woes-androids-arrayadapter/ (10认同)

Edw*_*ale 7

我在此期间与之相处的解决方案就是不使用ArrayAdapter.在你正在与这个API作斗争的情况下,似乎最好只使用功能较少(并且复杂)BaseAdapter.您可以阅读更多有关决定的内容BaseAdapter而不是ArrayAdapter本文:Android适配器良好实践.