package cl.monsoon.s1next.view.adapter; import android.app.Activity; import android.support.annotation.CallSuper; import android.support.v7.widget.RecyclerView; import android.view.ViewGroup; import com.google.common.base.Preconditions; import com.hannesdorfmann.adapterdelegates.AdapterDelegate; import com.hannesdorfmann.adapterdelegates.AdapterDelegatesManager; import java.util.ArrayList; import java.util.List; import cl.monsoon.s1next.view.adapter.delegate.ProgressAdapterDelegate; import cl.monsoon.s1next.view.adapter.item.ProgressItem; public abstract class BaseRecyclerViewAdapter<T> extends RecyclerView.Adapter { private static final int VIEW_TYPE_PROGRESS = 0; private List<Object> mList; private final AdapterDelegatesManager<List<Object>> mAdapterDelegatesManager; BaseRecyclerViewAdapter(Activity activity) { mList = new ArrayList<>(); mAdapterDelegatesManager = new AdapterDelegatesManager<>(); mAdapterDelegatesManager.addDelegate(new ProgressAdapterDelegate(activity, VIEW_TYPE_PROGRESS)); } @Override @CallSuper public int getItemViewType(int position) { return mAdapterDelegatesManager.getItemViewType(mList, position); } @Override @CallSuper public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { return mAdapterDelegatesManager.onCreateViewHolder(parent, viewType); } @Override @CallSuper public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { mAdapterDelegatesManager.onBindViewHolder(mList, position, holder); } @Override @CallSuper public int getItemCount() { return mList.size(); } @Override @CallSuper public long getItemId(int position) { Preconditions.checkArgument(mAdapterDelegatesManager.getItemViewType(mList, position) == VIEW_TYPE_PROGRESS); return Integer.MIN_VALUE; } final void addAdapterDelegate(AdapterDelegate<List<Object>> adapterDelegate) { Preconditions.checkArgument(adapterDelegate.getItemViewType() != VIEW_TYPE_PROGRESS); mAdapterDelegatesManager.addDelegate(adapterDelegate); } final int getItemViewTypeFromDelegatesManager(int position) { return mAdapterDelegatesManager.getItemViewType(mList, position); } public final void setHasProgress(boolean hasProgress) { if (hasProgress) { Preconditions.checkState(mList.size() == 0); mList.add(new ProgressItem()); } else { // we do not need to clear list if we have already changed // data set or we have no ProgressItem to been cleared if (mList.size() == 1 && mList.get(0) instanceof ProgressItem) { mList.clear(); } } } @SuppressWarnings("unchecked") public final void setDataSet(List<?> list) { mList = (List<Object>) list; } final Object getItem(int position) { return mList.get(position); } final void addItem(Object object) { mList.add(object); } final void removeItem(int position) { mList.remove(position); } }