package com.eyeem.recyclerviewtools.adapter;
import android.support.v7.widget.RecyclerView;
import android.view.ViewGroup;
/**
* Created by budius on 01.04.15.
* <p/>
* Base class for section adapter. Those are mostly mirrored calls from RecyclerView.Adapter only
* changing the name "view" to "section".
*/
public abstract class AbstractSectionAdapter<VH extends RecyclerView.ViewHolder> {
/**
* Return the view type of the section at <code>sectionNumber</code> for the purposes
* of view recycling.
* <p/>
* The default implementation of this method returns 0, making the assumption of
* a single view type for the adapter.
*
* @param sectionIndex section number to query
* @return integer value identifying the type of the view needed to represent the section at
* <code>position</code>.
*/
public int getSectionViewType(int sectionIndex) {
return 0;
}
/**
* Return the stable ID for the section at <code>sectionIndex</code>.
* This is queried only if the RecyclerView.Adapter this SectionAdapter is bound to
* return true to {@link android.support.v7.widget.RecyclerView.Adapter#hasStableIds() hasStableIds}
* <p/>
* The default implementation of this method returns <code>sectionIndex</code>.
*
* @param sectionIndex section index to query
* @return the stable ID of the section number
*/
public long getSectionId(int sectionIndex) {
return sectionIndex;
}
/**
* Similar to {@link android.support.v7.widget.RecyclerView.Adapter#onCreateViewHolder(android.view.ViewGroup, int) onCreateViewHolder}
* called by the adapter whenever the RecyclerView queries for a section ViewHolder
*
* @param parent The ViewGroup into which the new View will be added after it is bound to
* an adapter position.
* @param viewType value returned by {@link #getSectionViewType(int)}
* @return an object that extends {@link android.support.v7.widget.RecyclerView.ViewHolder}
*/
public abstract VH onCreateSectionViewHolder(ViewGroup parent, int viewType);
/**
* @param viewHolder
* @param sectionNumber
*/
public abstract void onBindSectionView(VH viewHolder, int sectionNumber);
/**
* Returns the total number of sections in the adapter.
*
* @return The total number of sections in this adapter.
*/
public abstract int getSectionCount();
/**
* Informs the WrapAdapter of the adapter position of each section.
* Must return {@link AbstractSectionAdapter#NOT_A_SECTION NOT_A_SECTION}
* if the queried position is not a section.
*
* @param position the position in the WrapAdapter
* @return the index of the section for that position or NOT_A_SECTION
*/
public abstract int getSectionIndex(int position);
/**
* Inverse of {@link #getSectionIndex(int)}. That's called during `notify_` events to offset
* the notified data to the {@link com.eyeem.recyclerviewtools.adapter.WrapAdapter} position.
*
* @param index the index of the section
* @return the position of the section within the wrapped adapter.
*/
public abstract int getSectionPosition(int index);
/**
* Possible optimisation. Calls to {@link #getSectionIndex(int)} and {@link #getSectionPosition(int)} are
* LruCached inside the {@link com.eyeem.recyclerviewtools.adapter.WrapAdapter}
* Returning `false` will disable the caching. Only do this if you're sure that your
* implementation can reliably return values faster than an {@link android.util.LruCache}
*
* @return false to disable the adapter internal LruCache
*/
public boolean lruCacheEnabled() {
return true;
}
/**
* Value to be returned from {@link com.eyeem.recyclerviewtools.adapter.AbstractSectionAdapter#getSectionIndex(int)}
* when the position is not a section
*/
public static final int NOT_A_SECTION = WrapAdapter.NOT_A_SECTION;
}