package com.etiennelawlor.loop.adapters; import android.support.v7.widget.RecyclerView; import android.view.View; import android.view.ViewGroup; import java.util.ArrayList; import java.util.List; /** * Created by etiennelawlor on 12/3/16. */ public abstract class BaseAdapter<T> extends RecyclerView.Adapter<RecyclerView.ViewHolder> { // region Constants protected static final int HEADER = 0; protected static final int ITEM = 1; protected static final int FOOTER = 2; // endregion // region Member Variables protected List<T> items; protected OnItemClickListener onItemClickListener; protected OnReloadClickListener onReloadClickListener; protected boolean isFooterAdded = false; // endregion // region Interfaces public interface OnItemClickListener { void onItemClick(int position, View view); } public interface OnReloadClickListener { void onReloadClick(); } // endregion // region Constructors public BaseAdapter() { items = new ArrayList<>(); } // endregion @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { RecyclerView.ViewHolder viewHolder = null; switch (viewType) { case HEADER: viewHolder = createHeaderViewHolder(parent); break; case ITEM: viewHolder = createItemViewHolder(parent); break; case FOOTER: viewHolder = createFooterViewHolder(parent); break; default: break; } return viewHolder; } @Override public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) { switch (getItemViewType(position)) { case HEADER: bindHeaderViewHolder(viewHolder); break; case ITEM: bindItemViewHolder(viewHolder, position); break; case FOOTER: bindFooterViewHolder(viewHolder); default: break; } } @Override public int getItemCount() { return items.size(); } // region Abstract Methods protected abstract RecyclerView.ViewHolder createHeaderViewHolder(ViewGroup parent); protected abstract RecyclerView.ViewHolder createItemViewHolder(ViewGroup parent); protected abstract RecyclerView.ViewHolder createFooterViewHolder(ViewGroup parent); protected abstract void bindHeaderViewHolder(RecyclerView.ViewHolder viewHolder); protected abstract void bindItemViewHolder(RecyclerView.ViewHolder viewHolder, int position); protected abstract void bindFooterViewHolder(RecyclerView.ViewHolder viewHolder); protected abstract void displayLoadMoreFooter(); protected abstract void displayErrorFooter(); public abstract void addFooter(); // endregion // region Helper Methods public T getItem(int position) { return items.get(position); } public void add(T item) { items.add(item); notifyItemInserted(items.size() - 1); } public void addAll(List<T> items) { for (T item : items) { add(item); } } private void remove(T item) { int position = items.indexOf(item); if (position > -1) { items.remove(position); notifyItemRemoved(position); } } public void clear() { isFooterAdded = false; while (getItemCount() > 0) { remove(getItem(0)); } } public boolean isEmpty() { return getItemCount() == 0; } public boolean isLastPosition(int position) { return (position == items.size()-1); } public void removeFooter() { isFooterAdded = false; int position = items.size() - 1; T item = getItem(position); if (item != null) { items.remove(position); notifyItemRemoved(position); } } public void updateFooter(FooterType footerType){ switch (footerType) { case LOAD_MORE: displayLoadMoreFooter(); break; case ERROR: displayErrorFooter(); break; default: break; } } public void setOnItemClickListener(OnItemClickListener onItemClickListener) { this.onItemClickListener = onItemClickListener; } public void setOnReloadClickListener(OnReloadClickListener onReloadClickListener) { this.onReloadClickListener = onReloadClickListener; } // endregion // region Inner Classes public enum FooterType { LOAD_MORE, ERROR } // endregion }