/*
* Copyright (C) 2012 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 com.bulletnoid.android.widget.StaggeredGridView;
import android.database.DataSetObserver;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListAdapter;
import android.widget.WrapperListAdapter;
public class HeaderFooterListAdapter implements WrapperListAdapter {
private ListAdapter mAdapter;
View mHeaderView;
View mFooterView;
boolean mAreAllFixedViewsSelectable;
private int headerSize = -1;
private int footerSize = -1;
public static int TYPE_COUNT_WITHOUT_REFRESHABLE_LIST = 2;
public static int HEADER_TYPE = 0;
public static int FOOTER_TYPE = HEADER_TYPE + 1;
public static int REFRESHABLE_LIST_TYPE = FOOTER_TYPE + 1;
public HeaderFooterListAdapter(View headerView, View footerView, ListAdapter adapter) {
mAdapter = adapter;
if (headerView == null) {
headerSize = 0;
} else {
headerSize = 1;
mHeaderView = headerView;
}
if (footerView == null) {
footerSize = 0;
} else {
footerSize = 1;
mFooterView = footerView;
}
mAreAllFixedViewsSelectable = true;
}
@Override
public ListAdapter getWrappedAdapter() {
return mAdapter;
}
@Override
public boolean areAllItemsEnabled() {
if (mAdapter != null) {
return mAreAllFixedViewsSelectable && mAdapter.areAllItemsEnabled();
} else {
return true;
}
}
@Override
public boolean isEnabled(int position) {
if (position < headerSize) {
return true;
}
int adjPosition = position - headerSize;
if (mAdapter != null) {
if (adjPosition < mAdapter.getCount()) {
return mAdapter.isEnabled(adjPosition);
}
}
return false;
}
@Override
public void registerDataSetObserver(DataSetObserver observer) {
if (mAdapter != null) {
mAdapter.registerDataSetObserver(observer);
}
}
@Override
public void unregisterDataSetObserver(DataSetObserver observer) {
if (mAdapter != null) {
mAdapter.unregisterDataSetObserver(observer);
}
}
@Override
public int getCount() {
if (mAdapter != null) {
return headerSize + footerSize + mAdapter.getCount();
} else {
return headerSize + footerSize;
}
}
@Override
public Object getItem(int position) {
if (position < headerSize) {
return mHeaderView;
}
final int adjPosition = position - headerSize;
int adapterCount = 0;
if (mAdapter != null) {
adapterCount = mAdapter.getCount();
if (adjPosition < adapterCount) {
return mAdapter.getItem(adjPosition);
}
}
return mFooterView;
}
@Override
public long getItemId(int position) {
if (mAdapter != null && position >= headerSize) {
int adjPosition = position - headerSize;
int adapterCount = mAdapter.getCount();
if (adjPosition < adapterCount) {
return mAdapter.getItemId(adjPosition);
}
}
return -1;
}
@Override
public boolean hasStableIds() {
if (mAdapter != null) {
return mAdapter.hasStableIds();
}
return false;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (position < headerSize) {
return mHeaderView;
}
final int adjPosition = position - headerSize;
int adapterCount = 0;
if (mAdapter != null) {
adapterCount = mAdapter.getCount();
if (adjPosition < adapterCount) {
return mAdapter.getView(adjPosition, convertView, parent);
}
}
return mFooterView;
}
@Override
public int getItemViewType(int position) {
if (position < headerSize) {
return HEADER_TYPE;
}
if (mAdapter != null && position >= headerSize) {
int adjPosition = position - headerSize;
int adapterCount = mAdapter.getCount();
if (adjPosition < adapterCount) {
return mAdapter.getItemViewType(adjPosition) + REFRESHABLE_LIST_TYPE;
}
}
return FOOTER_TYPE;
}
@Override
public int getViewTypeCount() {
if (mAdapter != null) {
return mAdapter.getViewTypeCount() + TYPE_COUNT_WITHOUT_REFRESHABLE_LIST;
}
return 1;
}
@Override
public boolean isEmpty() {
return mAdapter == null || mAdapter.isEmpty();
}
}