HeaderViewListAdapter.java revision 54b6cfa9a9e5b861a9930af873580d6dc20f773c
1/*
2 * Copyright (C) 2006 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package android.widget;
18
19import android.database.DataSetObserver;
20import android.view.View;
21import android.view.ViewGroup;
22
23import java.util.ArrayList;
24
25/**
26 * ListAdapter used when a ListView has header views. This ListAdapter
27 * wraps another one and also keeps track of the header views and their
28 * associated data objects.
29 *<p>This is intended as a base class; you will probably not need to
30 * use this class directly in your own code.
31 *
32 */
33public class HeaderViewListAdapter implements WrapperListAdapter, Filterable {
34
35    private ListAdapter mAdapter;
36
37    ArrayList<ListView.FixedViewInfo> mHeaderViewInfos;
38    ArrayList<ListView.FixedViewInfo> mFooterViewInfos;
39    boolean mAreAllFixedViewsSelectable;
40
41    private boolean mIsFilterable;
42
43    public HeaderViewListAdapter(ArrayList<ListView.FixedViewInfo> headerViewInfos,
44                                 ArrayList<ListView.FixedViewInfo> footerViewInfos,
45                                 ListAdapter adapter) {
46        mAdapter = adapter;
47        mIsFilterable = adapter instanceof Filterable;
48
49        mHeaderViewInfos = headerViewInfos;
50        mFooterViewInfos = footerViewInfos;
51
52        mAreAllFixedViewsSelectable =
53                areAllListInfosSelectable(mHeaderViewInfos)
54                && areAllListInfosSelectable(mFooterViewInfos);
55    }
56
57    public int getHeadersCount() {
58        return mHeaderViewInfos == null ? 0 : mHeaderViewInfos.size();
59    }
60
61    public int getFootersCount() {
62        return mFooterViewInfos == null ? 0 : mFooterViewInfos.size();
63    }
64
65    public boolean isEmpty() {
66        return mAdapter == null || mAdapter.isEmpty();
67    }
68
69    private boolean areAllListInfosSelectable(ArrayList<ListView.FixedViewInfo> infos) {
70        if (infos != null) {
71            for (ListView.FixedViewInfo info : infos) {
72                if (!info.isSelectable) {
73                    return false;
74                }
75            }
76        }
77        return true;
78    }
79
80    public boolean removeHeader(View v) {
81        for (int i = 0; i < mHeaderViewInfos.size(); i++) {
82            ListView.FixedViewInfo info = mHeaderViewInfos.get(i);
83            if (info.view == v) {
84                mHeaderViewInfos.remove(i);
85
86                mAreAllFixedViewsSelectable =
87                        areAllListInfosSelectable(mHeaderViewInfos)
88                        && areAllListInfosSelectable(mFooterViewInfos);
89
90                return true;
91            }
92        }
93
94        return false;
95    }
96
97    public boolean removeFooter(View v) {
98        for (int i = 0; i < mFooterViewInfos.size(); i++) {
99            ListView.FixedViewInfo info = mFooterViewInfos.get(i);
100            if (info.view == v) {
101                mFooterViewInfos.remove(i);
102
103                mAreAllFixedViewsSelectable =
104                        areAllListInfosSelectable(mHeaderViewInfos)
105                        && areAllListInfosSelectable(mFooterViewInfos);
106
107                return true;
108            }
109        }
110
111        return false;
112    }
113
114    public int getCount() {
115        if (mAdapter != null) {
116            return getFootersCount() + getHeadersCount() + mAdapter.getCount();
117        } else {
118            return getFootersCount() + getHeadersCount();
119        }
120    }
121
122    public boolean areAllItemsEnabled() {
123        if (mAdapter != null) {
124            return mAreAllFixedViewsSelectable && mAdapter.areAllItemsEnabled();
125        } else {
126            return true;
127        }
128    }
129
130    public boolean isEnabled(int position) {
131        int numHeaders = getHeadersCount();
132        if (mAdapter != null && position >= numHeaders) {
133            int adjPosition = position - numHeaders;
134            int adapterCount = mAdapter.getCount();
135            if (adjPosition >= adapterCount && mFooterViewInfos != null) {
136                return mFooterViewInfos.get(adjPosition - adapterCount).isSelectable;
137            } else {
138                return mAdapter.isEnabled(adjPosition);
139            }
140        } else if (position < numHeaders && mHeaderViewInfos != null) {
141            return mHeaderViewInfos.get(position).isSelectable;
142        }
143        return true;
144    }
145
146    public Object getItem(int position) {
147        int numHeaders = getHeadersCount();
148        if (mAdapter != null && position >= numHeaders) {
149            int adjPosition = position - numHeaders;
150            int adapterCount = mAdapter.getCount();
151            if (adjPosition >= adapterCount && mFooterViewInfos != null) {
152                return mFooterViewInfos.get(adjPosition - adapterCount).data;
153            } else {
154                return mAdapter.getItem(adjPosition);
155            }
156        } else if (position < numHeaders && mHeaderViewInfos != null) {
157            return mHeaderViewInfos.get(position).data;
158        }
159        return null;
160    }
161
162    public long getItemId(int position) {
163        int numHeaders = getHeadersCount();
164        if (mAdapter != null && position >= numHeaders) {
165            int adjPosition = position - numHeaders;
166            int adapterCnt = mAdapter.getCount();
167            if (adjPosition < adapterCnt) {
168                return mAdapter.getItemId(adjPosition);
169            }
170        }
171        return -1;
172    }
173
174    public boolean hasStableIds() {
175        if (mAdapter != null) {
176            return mAdapter.hasStableIds();
177        }
178        return false;
179    }
180
181    public View getView(int position, View convertView, ViewGroup parent) {
182        int numHeaders = getHeadersCount();
183        if (mAdapter != null && position >= numHeaders) {
184            int adjPosition = position - numHeaders;
185            int adapterCount = mAdapter.getCount();
186            if (adjPosition >= adapterCount) {
187                if (mFooterViewInfos != null) {
188                    return mFooterViewInfos.get(adjPosition - adapterCount).view;
189                }
190            } else {
191                return mAdapter.getView(adjPosition, convertView, parent);
192            }
193        } else if (position < numHeaders) {
194            return mHeaderViewInfos.get(position).view;
195        }
196        return null;
197    }
198
199    public int getItemViewType(int position) {
200        int numHeaders = getHeadersCount();
201        if (mAdapter != null && position >= numHeaders) {
202            int adjPosition = position - numHeaders;
203            int adapterCount = mAdapter.getCount();
204            if (adjPosition < adapterCount) {
205                return mAdapter.getItemViewType(adjPosition);
206            }
207        }
208
209        return AdapterView.ITEM_VIEW_TYPE_HEADER_OR_FOOTER;
210    }
211
212    public int getViewTypeCount() {
213        if (mAdapter != null) {
214            return mAdapter.getViewTypeCount();
215        }
216        return 1;
217    }
218
219    public void registerDataSetObserver(DataSetObserver observer) {
220        if (mAdapter != null) {
221            mAdapter.registerDataSetObserver(observer);
222        }
223    }
224
225    public void unregisterDataSetObserver(DataSetObserver observer) {
226        if (mAdapter != null) {
227            mAdapter.unregisterDataSetObserver(observer);
228        }
229    }
230
231    public Filter getFilter() {
232        if (mIsFilterable) {
233            return ((Filterable) mAdapter).getFilter();
234        }
235        return null;
236    }
237
238    public ListAdapter getWrappedAdapter() {
239        return mAdapter;
240    }
241}
242