1863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton/*
2863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton * Copyright (C) 2007 The Android Open Source Project
3863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton *
4863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton * Licensed under the Apache License, Version 2.0 (the "License");
5863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton * you may not use this file except in compliance with the License.
6863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton * You may obtain a copy of the License at
7863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton *
8863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton *      http://www.apache.org/licenses/LICENSE-2.0
9863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton *
10863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton * Unless required by applicable law or agreed to in writing, software
11863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton * distributed under the License is distributed on an "AS IS" BASIS,
12863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton * See the License for the specific language governing permissions and
14863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton * limitations under the License.
15863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton */
16863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
174e5a9e4ee5c1ecab0a7a8eebee883f3f189f5cb4Jeff Hamiltonpackage com.android.loaderapp.fragments;
18863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
19863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamiltonimport android.content.Context;
20863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamiltonimport android.net.Uri;
21863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamiltonimport android.os.Parcel;
22863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamiltonimport android.view.LayoutInflater;
23863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamiltonimport android.view.View;
24863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamiltonimport android.view.ViewGroup;
25863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamiltonimport android.widget.BaseAdapter;
26863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
27863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamiltonimport java.util.ArrayList;
28863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
29863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamiltonpublic abstract class ContactEntryAdapter<E extends ContactEntryAdapter.Entry>
30863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        extends BaseAdapter {
31863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
32863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    protected ArrayList<ArrayList<E>> mSections;
33863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    protected LayoutInflater mInflater;
34863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    protected Context mContext;
35863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    protected boolean mSeparators;
36863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
37863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    /**
38863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * Base class for adapter entries.
39863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     */
40863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    public static class Entry {
41863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        public int type = -1;
42863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        public String label;
43863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        public String data;
44863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        public Uri uri;
45863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        public long id = 0;
46863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        public long contactId;
47863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        public int maxLines = 1;
48863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        public String mimetype;
49863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
50863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        /**
51863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton         * Helper for making subclasses parcelable.
52863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton         */
53863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        protected void writeToParcel(Parcel p) {
54863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            p.writeInt(type);
55863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            p.writeString(label);
56863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            p.writeString(data);
57863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            p.writeParcelable(uri, 0);
58863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            p.writeLong(id);
59863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            p.writeInt(maxLines);
60863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            p.writeString(mimetype);
61863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        }
62863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
63863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        /**
64863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton         * Helper for making subclasses parcelable.
65863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton         */
66863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        protected void readFromParcel(Parcel p) {
67863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            final ClassLoader loader = getClass().getClassLoader();
68863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            type = p.readInt();
69863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            label = p.readString();
70863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            data = p.readString();
71863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            uri = p.readParcelable(loader);
72863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            id = p.readLong();
73863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            maxLines = p.readInt();
74863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            mimetype = p.readString();
75863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        }
76863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    }
77863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
78863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    ContactEntryAdapter(Context context, ArrayList<ArrayList<E>> sections, boolean separators) {
79863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        mContext = context;
80863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
81863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        mSections = sections;
82863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        mSeparators = separators;
83863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    }
84863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
85863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    /**
86863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * Resets the section data.
87863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     *
88863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * @param sections the section data
89863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     */
90863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    public final void setSections(ArrayList<ArrayList<E>> sections, boolean separators) {
91863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        mSections = sections;
92863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        mSeparators = separators;
93863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        notifyDataSetChanged();
94863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    }
95863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
96863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    /**
97863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * Resets the section data and returns the position of the given entry.
98863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     *
99863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * @param sections the section data
100863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * @param entry the entry to return the position for
101863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * @return the position of entry, or -1 if it isn't found
102863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     */
103863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    public final int setSections(ArrayList<ArrayList<E>> sections, E entry) {
104863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        mSections = sections;
105863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        notifyDataSetChanged();
106863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
107863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        int numSections = mSections.size();
108863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        int position = 0;
109863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        for (int i = 0; i < numSections; i++) {
110863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            ArrayList<E> section = mSections.get(i);
111863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            int sectionSize = section.size();
112863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            for (int j = 0; j < sectionSize; j++) {
113863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton                E e = section.get(j);
114863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton                if (e.equals(entry)) {
115863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton                    position += j;
116863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton                    return position;
117863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton                }
118863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            }
119863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            position += sectionSize;
120863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        }
121863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        return -1;
122863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    }
123863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
124863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    /**
125863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * @see android.widget.ListAdapter#getCount()
126863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     */
127863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    public final int getCount() {
128863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        return countEntries(mSections, mSeparators);
129863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    }
130863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
131863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    /**
132863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * @see android.widget.ListAdapter#hasSeparators()
133863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     */
134863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    @Override
135863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    public final boolean areAllItemsEnabled() {
136863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        return mSeparators == false;
137863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    }
138863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
139863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    /**
140863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * @see android.widget.ListAdapter#isSeparator(int)
141863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     */
142863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    @Override
143863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    public final boolean isEnabled(int position) {
144863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        if (!mSeparators) {
145863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            return true;
146863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        }
147863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
148863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        int numSections = mSections.size();
149863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        for (int i = 0; i < numSections; i++) {
150863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            ArrayList<E> section = mSections.get(i);
151863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            int sectionSize = section.size();
152863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            if (sectionSize == 1) {
153863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton                // The section only contains a separator and nothing else, skip it
154863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton                continue;
155863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            }
156863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            if (position == 0) {
157863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton                // The first item in a section is always the separator
158863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton                return false;
159863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            }
160863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            position -= sectionSize;
161863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        }
162863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        return true;
163863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    }
164863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
165863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    /**
166863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * @see android.widget.ListAdapter#getItem(int)
167863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     */
168863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    public final Object getItem(int position) {
169863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        return getEntry(mSections, position, mSeparators);
170863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    }
171863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
172863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    /**
173863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * Get the entry for the given position.
174863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     *
175863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * @param sections the list of sections
176863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * @param position the position for the desired entry
177863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * @return the ContactEntry for the given position
178863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     */
179863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    public final static <T extends Entry> T getEntry(ArrayList<ArrayList<T>> sections,
180863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            int position, boolean separators) {
181863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        int numSections = sections.size();
182863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        for (int i = 0; i < numSections; i++) {
183863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            ArrayList<T> section = sections.get(i);
184863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            int sectionSize = section.size();
185863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            if (separators && sectionSize == 1) {
186863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton                // The section only contains a separator and nothing else, skip it
187863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton                continue;
188863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            }
189863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            if (position < section.size()) {
190863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton                return section.get(position);
191863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            }
192863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            position -= section.size();
193863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        }
194863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        return null;
195863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    }
196863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
197863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    /**
198863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * Get the count of entries in all sections
199863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     *
200863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * @param sections the list of sections
201863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * @return the count of entries in all sections
202863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     */
203863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    public static <T extends Entry> int countEntries(ArrayList<ArrayList<T>> sections,
204863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            boolean separators) {
205863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        int count = 0;
206863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        int numSections = sections.size();
207863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        for (int i = 0; i < numSections; i++) {
208863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            ArrayList<T> section = sections.get(i);
209863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            int sectionSize = section.size();
210863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            if (separators && sectionSize == 1) {
211863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton                // The section only contains a separator and nothing else, skip it
212863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton                continue;
213863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            }
214863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            count += sections.get(i).size();
215863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        }
216863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        return count;
217863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    }
218863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
219863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    /**
220863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * @see android.widget.ListAdapter#getItemId(int)
221863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     */
222863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    public final long getItemId(int position) {
223863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        Entry entry = getEntry(mSections, position, mSeparators);
224863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        if (entry != null) {
225863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            return entry.id;
226863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        } else {
227863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            return -1;
228863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        }
229863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    }
230863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
231863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    /**
232863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * @see android.widget.ListAdapter#getView(int, View, ViewGroup)
233863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     */
234863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    public View getView(int position, View convertView, ViewGroup parent) {
235863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        View v;
236863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        if (convertView == null) {
237863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            v = newView(position, parent);
238863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        } else {
239863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            v = convertView;
240863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        }
241863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        bindView(v, getEntry(mSections, position, mSeparators));
242863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        return v;
243863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    }
244863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
245863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    /**
246863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * Create a new view for an entry.
247863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     *
248863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * @parent the parent ViewGroup
249863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * @return the newly created view
250863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     */
251863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    protected abstract View newView(int position, ViewGroup parent);
252863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
253863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    /**
254863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * Binds the data from an entry to a view.
255863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     *
256863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * @param view the view to display the entry in
257863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * @param entry the data to bind
258863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     */
259863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    protected abstract void bindView(View view, E entry);
260863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton}
261