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