Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Getting all of the items from an ArrayAdapter

Tags:

android

I have a ListFragment backed by an ArrayAdapter that gets populated by a Loader. When the user clicks on one of the items, I want to pass a reference to the selected item, as well as the rest of the list items to another fragment. My question is how should I get all of the items from the adapter? Here are the possibilities that I see:

1. Keep a reference to the backing List

Create the adapter like so:

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

and then simply pass items or a copy of it to the next activity.

The downside I see of this is that I'm relying on the undocumented fact that the same list that I pass to the constructor contains the items later on.

2. Iterate through the adapter

When an item is clicked, iterate through the adapter and build up the list. This seems like an unnecessary amount of work. The items are contained in a List in the adapter and I'm manually copying each item to a new list.

3. Keep a separate list of items when adding to adapter

Before adding an item to the adapter, add it to a separate list that I maintain in the fragment. This is also wasteful as the list of items is copied in the ArrayAdapter and the fragment.

like image 479
Edward Dale Avatar asked Jul 25 '12 12:07

Edward Dale


2 Answers

I'm a little late to the game, but I've run up against a similar issue.

One way to deal with #1 would be to maintain the reference to the list within a subclass of ArrayAdapter, so that your reuse is controlled by the adapter object.

Something like:

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;
    }
}
like image 113
theisenp Avatar answered Oct 14 '22 14:10

theisenp


The solution that I've gone with in the meantime is just to not use ArrayAdapter. In cases where you're fighting against this API, it seems like it's better just to use the less fully-featured (and complex) BaseAdapter. You can read more about the decision to go with BaseAdapter instead of ArrayAdapter in this article: Android Adapter Good Practices.

like image 40
Edward Dale Avatar answered Oct 14 '22 12:10

Edward Dale