package com.circlegate.liban.adapter; import java.util.ArrayList; import java.util.Collection; import java.util.List; import com.circlegate.liban.R; import com.circlegate.liban.view.LoadingView; import com.google.common.collect.ImmutableList; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; public abstract class BaseAdapterWithPaging<Item> extends BaseAdapter { public static final int VIEW_TYPE_ITEM = 0; public static final int VIEW_TYPE_LOAD_MORE = 1; public static final int VIEW_TYPE_COUNT = 2; private final Context context; private final LayoutInflater inflater; private final List<Item> items = new ArrayList<Item>(); private int lastPageInd = -1; private boolean hasMorePages = false; private boolean wasLoadMoreItemsHandled = false; private OnLoadMoreItemsListener onLoadMoreItemsListener; public BaseAdapterWithPaging(Context context) { this.context = context; this.inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } // // GETTERS // public Context getContext() { return this.context; } public LayoutInflater getInflater() { return this.inflater; } public int getLastPageInd() { return this.lastPageInd; } public boolean getHasMorePages() { return this.hasMorePages; } public int getItemsCount() { return this.items.size(); } public ImmutableList<Item> generateItems() { return ImmutableList.copyOf(this.items); } // // SETTERS // public void setItems(Collection<? extends Item> items, int pageInd, boolean hasMorePages) { this.items.clear(); addItems(items, pageInd, hasMorePages); } public void addItems(Collection<? extends Item> items, int pageInd, boolean hasMorePages) { this.lastPageInd = pageInd; this.hasMorePages = hasMorePages; this.wasLoadMoreItemsHandled = false; this.items.addAll(items); this.notifyDataSetChanged(); } public void replaceItemDontNotify(int index, Item item) { this.items.set(index, item); } public void replaceItemsDontNotify(List<? extends Item> items) { if (this.items.size() != items.size()) throw new RuntimeException("Wrong items count!"); this.items.clear(); this.items.addAll(items); } public boolean clear() { if (this.lastPageInd != -1 || this.hasMorePages != false || this.wasLoadMoreItemsHandled != false || this.items.size() > 0) { this.lastPageInd = -1; this.hasMorePages = false; this.wasLoadMoreItemsHandled = false; this.items.clear(); notifyDataSetChanged(); return true; } else return false; } // // OVERRIDES // @Override public int getCount() { return this.items.size() + (hasMorePages ? 1 : 0); } @Override public Item getItem(int position) { return position < this.items.size() ? this.items.get(position) : null; } @Override public long getItemId(int position) { return position; } @Override public int getItemViewType(int position) { return hasMorePages && position == this.items.size() ? VIEW_TYPE_LOAD_MORE : VIEW_TYPE_ITEM; } @Override public int getViewTypeCount() { return VIEW_TYPE_COUNT; } @Override public boolean isEnabled(int position) { return position < this.items.size(); } @Override public View getView(int position, View convertView, ViewGroup parent) { if (hasMorePages && position == this.items.size()) { if (!this.wasLoadMoreItemsHandled) { this.wasLoadMoreItemsHandled = onLoadMoreItems(this.lastPageInd + 1); } if (convertView == null) { convertView = newViewLoading(position, parent); } return convertView; } else { return getViewItem(position, convertView, parent); } } // // PROTECTED // public View newViewLoading(int position, ViewGroup parent) { View convertView = (LoadingView)inflater.inflate(R.layout.adapter_loading_view, parent, false); setupLoadingView((LoadingView)convertView); return convertView; } protected abstract View getViewItem(int position, View convertView, ViewGroup parent); protected void setupLoadingView(LoadingView loadingView) { } // // LISTENERS // protected boolean onLoadMoreItems(int newPageInd) { if (this.onLoadMoreItemsListener != null) { return this.onLoadMoreItemsListener.onLoadMoreItems(newPageInd); } return false; } public void setOnLoadMoreItemsListener(OnLoadMoreItemsListener l) { this.onLoadMoreItemsListener = l; } public interface OnLoadMoreItemsListener { boolean onLoadMoreItems(int newPageInd); } }