package com.mikepenz.fastadapter.commons.adapters; import android.support.v7.widget.RecyclerView; import android.view.ViewGroup; import com.mikepenz.fastadapter.IItem; import java.util.ArrayList; import java.util.List; /** * Created by mikepenz on 03.03.16. */ public abstract class AbstractWrapAdapter<Item extends IItem> extends RecyclerView.Adapter { //the items handled and managed by this item private List<Item> mItems = new ArrayList<>(); //private AbstractAdapter mParentAdapter; //keep a reference to the FastAdapter which contains the base logic private RecyclerView.Adapter mAdapter; public AbstractWrapAdapter(List<Item> items) { this.mItems = items; } public List<Item> getItems() { return mItems; } public void setItems(List<Item> items) { this.mItems = items; } /** * Wrap the FastAdapter with this AbstractAdapter and keep its reference to forward all events correctly * * @param adapter the FastAdapter which contains the base logic * @return this */ public AbstractWrapAdapter wrap(RecyclerView.Adapter adapter) { //this.mParentAdapter = abstractAdapter; this.mAdapter = adapter; return this; } /** * this method states if we should insert a custom element at the vien position * * @param position * @return */ public abstract boolean shouldInsertItemAtPosition(int position); /** * this method calculates how many elements were already inserted before this position; * * @param position * @return */ public abstract int itemInsertedBeforeCount(int position); /** * overwrite the registerAdapterDataObserver to correctly forward all events to the FastAdapter * * @param observer */ @Override public void registerAdapterDataObserver(RecyclerView.AdapterDataObserver observer) { super.registerAdapterDataObserver(observer); if (mAdapter != null) { mAdapter.registerAdapterDataObserver(observer); } } /** * overwrite the unregisterAdapterDataObserver to correctly forward all events to the FastAdapter * * @param observer */ @Override public void unregisterAdapterDataObserver(RecyclerView.AdapterDataObserver observer) { super.unregisterAdapterDataObserver(observer); if (mAdapter != null) { mAdapter.unregisterAdapterDataObserver(observer); } } /** * overwrite the getItemViewType to correctly return the value from the FastAdapter * * @param position * @return */ @Override public int getItemViewType(int position) { if (shouldInsertItemAtPosition(position)) { return getItem(position).getType(); } else { return mAdapter.getItemViewType(position - itemInsertedBeforeCount(position)); } } /** * overwrite the getItemId to correctly return the value from the FastAdapter * * @param position * @return */ @Override public long getItemId(int position) { if (shouldInsertItemAtPosition(position)) { return getItem(position).getIdentifier(); } else { return mAdapter.getItemId(position - itemInsertedBeforeCount(position)); } } /** * @return the reference to the FastAdapter */ public RecyclerView.Adapter getAdapter() { return mAdapter; } /** * make sure we return the Item from the FastAdapter so we retrieve the item from all adapters * * @param position * @return */ public Item getItem(int position) { if (shouldInsertItemAtPosition(position)) { return mItems.get(itemInsertedBeforeCount(position - 1)); } return null; } /** * make sure we return the count from the FastAdapter so we retrieve the count from all adapters * * @return */ @Override public int getItemCount() { int itemCount = mAdapter.getItemCount(); return itemCount + itemInsertedBeforeCount(itemCount); } /** * the onCreateViewHolder is managed by the FastAdapter so forward this correctly * * @param parent * @param viewType * @return */ @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { //TODO OPTIMIZE for (Item item : mItems) { if (item.getType() == viewType) { return item.getViewHolder(parent); } } return mAdapter.onCreateViewHolder(parent, viewType); } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { //empty implementation as the one with the List payloads is already called } /** * the onBindViewHolder is managed by the FastAdapter so forward this correctly * * @param holder * @param position */ @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position, List payloads) { if (shouldInsertItemAtPosition(position)) { getItem(position).bindView(holder, payloads); } else { mAdapter.onBindViewHolder(holder, position - itemInsertedBeforeCount(position), payloads); } } /** * the setHasStableIds is managed by the FastAdapter so forward this correctly * * @param hasStableIds */ @Override public void setHasStableIds(boolean hasStableIds) { mAdapter.setHasStableIds(hasStableIds); } /** * the onViewRecycled is managed by the FastAdapter so forward this correctly * * @param holder */ @Override public void onViewRecycled(RecyclerView.ViewHolder holder) { mAdapter.onViewRecycled(holder); } /** * the onFailedToRecycleView is managed by the FastAdapter so forward this correctly * * @param holder * @return */ @Override public boolean onFailedToRecycleView(RecyclerView.ViewHolder holder) { return mAdapter.onFailedToRecycleView(holder); } /** * the onViewDetachedFromWindow is managed by the FastAdapter so forward this correctly * * @param holder */ @Override public void onViewDetachedFromWindow(RecyclerView.ViewHolder holder) { mAdapter.onViewDetachedFromWindow(holder); } /** * the onViewAttachedToWindow is managed by the FastAdapter so forward this correctly * * @param holder */ @Override public void onViewAttachedToWindow(RecyclerView.ViewHolder holder) { mAdapter.onViewAttachedToWindow(holder); } /** * the onAttachedToRecyclerView is managed by the FastAdapter so forward this correctly * * @param recyclerView */ @Override public void onAttachedToRecyclerView(RecyclerView recyclerView) { mAdapter.onAttachedToRecyclerView(recyclerView); } /** * the onDetachedFromRecyclerView is managed by the FastAdapter so forward this correctly * * @param recyclerView */ @Override public void onDetachedFromRecyclerView(RecyclerView recyclerView) { mAdapter.onDetachedFromRecyclerView(recyclerView); } }