package com.ecollege.android.adapter; import android.app.Activity; import android.content.Context; import android.database.DataSetObserver; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ListAdapter; import com.ecollege.android.R; public class LoadMoreAdapter extends BaseAdapter { public static final long LOAD_MORE_ITEM_ID = Long.MAX_VALUE - 1;//minus one in case max_value is used public static final long LOADING_ITEM_ID = Long.MAX_VALUE - 2;//minus one in case max_value is used private boolean canLoadMore = true; private boolean isLoadingMore = false; private ListAdapter baseAdapter; private Context context; private SimpleObserver baseObserver; public LoadMoreAdapter(Context context, ListAdapter baseAdapter, boolean canLoadMore) { this.baseAdapter = baseAdapter; this.canLoadMore = canLoadMore; this.context = context; baseObserver = new SimpleObserver(this); if (baseAdapter != null) { baseAdapter.registerDataSetObserver(baseObserver); } } public void setIsLoadingMore(boolean isLoadingMore) { this.isLoadingMore = isLoadingMore; this.notifyDataSetChanged(); } public void update(ListAdapter baseAdapter, boolean canLoadMore) { assert baseAdapter != null; this.isLoadingMore = false; if (this.baseAdapter != null) { this.baseAdapter.unregisterDataSetObserver(baseObserver); } this.baseAdapter = baseAdapter; this.baseAdapter.registerDataSetObserver(baseObserver); this.canLoadMore = canLoadMore; this.notifyDataSetChanged(); } public int getCount() { if (canLoadMore || isLoadingMore) return baseAdapter.getCount() + 1; return baseAdapter.getCount(); } public Object getItem(int position) { if (position < baseAdapter.getCount()) { return baseAdapter.getItem(position); } else { return this; } } public long getItemId(int position) { if (position < baseAdapter.getCount()) { return baseAdapter.getItemId(position); } else { if (isLoadingMore) return LOADING_ITEM_ID; return LOAD_MORE_ITEM_ID; } } protected int loadMoreViewType() { return (baseAdapter.getViewTypeCount() - 1) + 1; } protected int loadingViewType() { return (baseAdapter.getViewTypeCount() - 1) + 2; } public int getItemViewType(int position) { if (position < baseAdapter.getCount()) { return baseAdapter.getItemViewType(position); } else { if (isLoadingMore) return loadingViewType(); return loadMoreViewType(); } } public View getLoadMoreView(int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = ((Activity)context).getLayoutInflater().inflate(R.layout.load_more_item, null); } return convertView; } public View getLoadingView(int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = ((Activity)context).getLayoutInflater().inflate(R.layout.loading_item, null); } return convertView; } public View getView(int position, View convertView, ViewGroup parent) { if (position < baseAdapter.getCount()) { return baseAdapter.getView(position,convertView,parent); } else { if (isLoadingMore) { return getLoadingView(position, convertView, parent); } return getLoadMoreView(position, convertView, parent); } } public int getViewTypeCount() { return baseAdapter.getViewTypeCount() + 2; } public void registerDataSetObserver(DataSetObserver observer) { super.registerDataSetObserver(observer); } public void unregisterDataSetObserver(DataSetObserver observer) { super.unregisterDataSetObserver(observer); } public boolean hasStableIds() { return baseAdapter.hasStableIds(); } public boolean isEmpty() { return baseAdapter.isEmpty(); } public boolean areAllItemsEnabled() { if (isLoadingMore) return false; return baseAdapter.areAllItemsEnabled(); } public boolean isEnabled(int position) { if (position < baseAdapter.getCount()) { return baseAdapter.isEnabled(position); } else { if (isLoadingMore) return false; return true; } } private class SimpleObserver extends DataSetObserver { private LoadMoreAdapter adapter; public SimpleObserver(LoadMoreAdapter adapter) { this.adapter = adapter; } @Override public void onChanged() { adapter.notifyDataSetChanged(); } @Override public void onInvalidated() { adapter.notifyDataSetInvalidated(); } } }