diff options
Diffstat (limited to 'android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/HeaderViewListAdapter.java')
-rw-r--r-- | android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/HeaderViewListAdapter.java | 180 |
1 files changed, 180 insertions, 0 deletions
diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/HeaderViewListAdapter.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/HeaderViewListAdapter.java new file mode 100644 index 0000000000..b633c23715 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/widget/HeaderViewListAdapter.java @@ -0,0 +1,180 @@ + +package org.holoeverywhere.widget; + +import java.util.ArrayList; +import java.util.List; + +import android.view.View; +import android.view.ViewGroup; +import android.widget.Filter; +import android.widget.Filterable; +import android.widget.ListAdapter; + +public class HeaderViewListAdapter extends ListAdapterWrapper implements Filterable { + public static final class ViewInfo { + public Object data; + public boolean isSelectable; + public View view; + } + + private static final List<ViewInfo> EMPTY_INFO_LIST = new ArrayList<ViewInfo>(); + boolean mAreAllFixedViewsSelectable; + private final List<ViewInfo> mFooterViewInfos; + private final List<ViewInfo> mHeaderViewInfos; + private final boolean mIsFilterable; + + public HeaderViewListAdapter(List<ViewInfo> headerViewInfos, + List<ViewInfo> footerViewInfos, ListAdapter adapter, ListAdapterCallback listener) { + super(adapter, listener); + mIsFilterable = adapter instanceof Filterable; + if (headerViewInfos == null) { + mHeaderViewInfos = EMPTY_INFO_LIST; + } else { + mHeaderViewInfos = headerViewInfos; + } + if (footerViewInfos == null) { + mFooterViewInfos = EMPTY_INFO_LIST; + } else { + mFooterViewInfos = footerViewInfos; + } + mAreAllFixedViewsSelectable = + areAllListInfosSelectable(mHeaderViewInfos) + && areAllListInfosSelectable(mFooterViewInfos); + } + + @Override + public boolean areAllItemsEnabled() { + return mAreAllFixedViewsSelectable && getWrappedAdapter().areAllItemsEnabled(); + } + + private boolean areAllListInfosSelectable(List<ViewInfo> infos) { + if (infos != null) { + for (ViewInfo info : infos) { + if (!info.isSelectable) { + return false; + } + } + } + return true; + } + + @Override + public int getCount() { + return getFootersCount() + getHeadersCount() + getWrappedAdapter().getCount(); + } + + @Override + public Filter getFilter() { + if (mIsFilterable) { + return ((Filterable) getWrappedAdapter()).getFilter(); + } + return null; + } + + public int getFootersCount() { + return mFooterViewInfos.size(); + } + + public int getHeadersCount() { + return mHeaderViewInfos.size(); + } + + @Override + public Object getItem(int position) { + int numHeaders = getHeadersCount(); + if (position < numHeaders) { + return mHeaderViewInfos.get(position).data; + } + final int adjPosition = position - numHeaders; + int adapterCount = getWrappedAdapter().getCount(); + if (adjPosition < adapterCount) { + return super.getItem(adjPosition); + } + return mFooterViewInfos.get(adjPosition - adapterCount).data; + } + + @Override + public long getItemId(int position) { + int numHeaders = getHeadersCount(); + if (position >= numHeaders) { + int adjPosition = position - numHeaders; + int adapterCount = getWrappedAdapter().getCount(); + if (adjPosition < adapterCount) { + return super.getItemId(adjPosition); + } + } + return AdapterView.INVALID_ROW_ID; + } + + @Override + public int getItemViewType(int position) { + int numHeaders = getHeadersCount(); + if (getWrappedAdapter() != null && position >= numHeaders) { + int adjPosition = position - numHeaders; + int adapterCount = getWrappedAdapter().getCount(); + if (adjPosition < adapterCount) { + return super.getItemViewType(adjPosition); + } + } + return AdapterView.ITEM_VIEW_TYPE_HEADER_OR_FOOTER; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + int numHeaders = getHeadersCount(); + if (position < numHeaders) { + convertView = mHeaderViewInfos.get(position).view; + } else { + final int adjPosition = position - numHeaders; + int adapterCount = getWrappedAdapter().getCount(); + if (adjPosition < adapterCount) { + convertView = getWrappedAdapter().getView(adjPosition, convertView, parent); + } else { + convertView = mFooterViewInfos.get(adjPosition - adapterCount).view; + } + } + return onPrepareView(convertView, position); + } + + @Override + public boolean isEnabled(int position) { + int numHeaders = getHeadersCount(); + if (position < numHeaders) { + return mHeaderViewInfos.get(position).isSelectable; + } + final int adjPosition = position - numHeaders; + int adapterCount = getWrappedAdapter().getCount(); + if (adjPosition < adapterCount) { + return super.isEnabled(adjPosition); + } + return mFooterViewInfos.get(adjPosition - adapterCount).isSelectable; + } + + public boolean removeFooter(View v) { + for (int i = 0; i < mFooterViewInfos.size(); i++) { + ViewInfo info = mFooterViewInfos.get(i); + if (info.view == v) { + mFooterViewInfos.remove(i); + mAreAllFixedViewsSelectable = + areAllListInfosSelectable(mHeaderViewInfos) + && areAllListInfosSelectable(mFooterViewInfos); + return true; + } + } + return false; + } + + public boolean removeHeader(View v) { + for (int i = 0; i < mHeaderViewInfos.size(); i++) { + ViewInfo info = mHeaderViewInfos.get(i); + if (info.view == v) { + mHeaderViewInfos.remove(i); + mAreAllFixedViewsSelectable = + areAllListInfosSelectable(mHeaderViewInfos) + && areAllListInfosSelectable(mFooterViewInfos); + return true; + } + } + return false; + } +} |