/* * Copyright (C) 2006 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package android.widget; import android.database.DataSetObserver; import android.view.View; import android.view.ViewGroup; import java.util.ArrayList; /** * ListAdapter used when a ListView has header views. This ListAdapter * wraps another one and also keeps track of the header views and their * associated data objects. *<p>This is intended as a base class; you will probably not need to * use this class directly in your own code. * */ public class HeaderViewListAdapter implements WrapperListAdapter, Filterable { private ListAdapter mAdapter; ArrayList<ListView.FixedViewInfo> mHeaderViewInfos; ArrayList<ListView.FixedViewInfo> mFooterViewInfos; boolean mAreAllFixedViewsSelectable; private boolean mIsFilterable; public HeaderViewListAdapter(ArrayList<ListView.FixedViewInfo> headerViewInfos, ArrayList<ListView.FixedViewInfo> footerViewInfos, ListAdapter adapter) { mAdapter = adapter; mIsFilterable = adapter instanceof Filterable; mHeaderViewInfos = headerViewInfos; mFooterViewInfos = footerViewInfos; mAreAllFixedViewsSelectable = areAllListInfosSelectable(mHeaderViewInfos) && areAllListInfosSelectable(mFooterViewInfos); } public int getHeadersCount() { return mHeaderViewInfos == null ? 0 : mHeaderViewInfos.size(); } public int getFootersCount() { return mFooterViewInfos == null ? 0 : mFooterViewInfos.size(); } public boolean isEmpty() { return mAdapter == null || mAdapter.isEmpty(); } private boolean areAllListInfosSelectable(ArrayList<ListView.FixedViewInfo> infos) { if (infos != null) { for (ListView.FixedViewInfo info : infos) { if (!info.isSelectable) { return false; } } } return true; } public boolean removeHeader(View v) { for (int i = 0; i < mHeaderViewInfos.size(); i++) { ListView.FixedViewInfo info = mHeaderViewInfos.get(i); if (info.view == v) { mHeaderViewInfos.remove(i); mAreAllFixedViewsSelectable = areAllListInfosSelectable(mHeaderViewInfos) && areAllListInfosSelectable(mFooterViewInfos); return true; } } return false; } public boolean removeFooter(View v) { for (int i = 0; i < mFooterViewInfos.size(); i++) { ListView.FixedViewInfo info = mFooterViewInfos.get(i); if (info.view == v) { mFooterViewInfos.remove(i); mAreAllFixedViewsSelectable = areAllListInfosSelectable(mHeaderViewInfos) && areAllListInfosSelectable(mFooterViewInfos); return true; } } return false; } public int getCount() { if (mAdapter != null) { return getFootersCount() + getHeadersCount() + mAdapter.getCount(); } else { return getFootersCount() + getHeadersCount(); } } public boolean areAllItemsEnabled() { if (mAdapter != null) { return mAreAllFixedViewsSelectable && mAdapter.areAllItemsEnabled(); } else { return true; } } public boolean isEnabled(int position) { int numHeaders = getHeadersCount(); if (mAdapter != null && position >= numHeaders) { int adjPosition = position - numHeaders; int adapterCount = mAdapter.getCount(); if (adjPosition >= adapterCount && mFooterViewInfos != null) { return mFooterViewInfos.get(adjPosition - adapterCount).isSelectable; } else { return mAdapter.isEnabled(adjPosition); } } else if (position < numHeaders && mHeaderViewInfos != null) { return mHeaderViewInfos.get(position).isSelectable; } return true; } public Object getItem(int position) { int numHeaders = getHeadersCount(); if (mAdapter != null && position >= numHeaders) { int adjPosition = position - numHeaders; int adapterCount = mAdapter.getCount(); if (adjPosition >= adapterCount && mFooterViewInfos != null) { return mFooterViewInfos.get(adjPosition - adapterCount).data; } else { return mAdapter.getItem(adjPosition); } } else if (position < numHeaders && mHeaderViewInfos != null) { return mHeaderViewInfos.get(position).data; } return null; } public long getItemId(int position) { int numHeaders = getHeadersCount(); if (mAdapter != null && position >= numHeaders) { int adjPosition = position - numHeaders; int adapterCnt = mAdapter.getCount(); if (adjPosition < adapterCnt) { return mAdapter.getItemId(adjPosition); } } return -1; } public boolean hasStableIds() { if (mAdapter != null) { return mAdapter.hasStableIds(); } return false; } public View getView(int position, View convertView, ViewGroup parent) { int numHeaders = getHeadersCount(); if (mAdapter != null && position >= numHeaders) { int adjPosition = position - numHeaders; int adapterCount = mAdapter.getCount(); if (adjPosition >= adapterCount) { if (mFooterViewInfos != null) { return mFooterViewInfos.get(adjPosition - adapterCount).view; } } else { return mAdapter.getView(adjPosition, convertView, parent); } } else if (position < numHeaders) { return mHeaderViewInfos.get(position).view; } return null; } public int getItemViewType(int position) { int numHeaders = getHeadersCount(); if (mAdapter != null && position >= numHeaders) { int adjPosition = position - numHeaders; int adapterCount = mAdapter.getCount(); if (adjPosition < adapterCount) { return mAdapter.getItemViewType(adjPosition); } } return AdapterView.ITEM_VIEW_TYPE_HEADER_OR_FOOTER; } public int getViewTypeCount() { if (mAdapter != null) { return mAdapter.getViewTypeCount(); } return 1; } public void registerDataSetObserver(DataSetObserver observer) { if (mAdapter != null) { mAdapter.registerDataSetObserver(observer); } } public void unregisterDataSetObserver(DataSetObserver observer) { if (mAdapter != null) { mAdapter.unregisterDataSetObserver(observer); } } public Filter getFilter() { if (mIsFilterable) { return ((Filterable) mAdapter).getFilter(); } return null; } public ListAdapter getWrappedAdapter() { return mAdapter; } }