package com.bigfat.materialviewpagertest; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import com.github.florent37.materialviewpager.R; /** * Created by florentchampigny on 24/04/15. * A RecyclerView.Adapter which inject a header to the actual RecyclerView.Adapter */ public class RecyclerViewMaterialAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { //the constants value of the header view static final int TYPE_PLACEHOLDER = Integer.MIN_VALUE; //the size taken by the header private int mPlaceholderSize = 1; //the actual RecyclerView.Adapter private RecyclerView.Adapter mAdapter; /** * Construct the RecyclerViewMaterialAdapter, which inject a header into an actual RecyclerView.Adapter * * @param adapter The real RecyclerView.Adapter which displays content */ public RecyclerViewMaterialAdapter(RecyclerView.Adapter adapter) { this.mAdapter = adapter; registerAdapterObserver(); } /** * Construct the RecyclerViewMaterialAdapter, which inject a header into an actual RecyclerView.Adapter * * @param adapter The real RecyclerView.Adapter which displays content * @param placeholderSize The number of placeholder items before real items, default is 1 */ public RecyclerViewMaterialAdapter(RecyclerView.Adapter adapter, int placeholderSize) { this.mAdapter = adapter; mPlaceholderSize = placeholderSize; registerAdapterObserver(); } protected void registerAdapterObserver() { if (mAdapter != null) { this.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() { @Override public void onChanged() { super.onChanged(); mAdapter.notifyDataSetChanged(); } }); } } @Override public int getItemViewType(int position) { if (position < mPlaceholderSize) return TYPE_PLACEHOLDER; else return mAdapter.getItemViewType(position - mPlaceholderSize); //call getItemViewType on the adapter, less mPlaceholderSize } //dispatch getItemCount to the actual adapter, add mPlaceholderSize @Override public int getItemCount() { return mAdapter.getItemCount() + mPlaceholderSize; } //add the header on first position, else display the true adapter's cells @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = null; switch (viewType) { case TYPE_PLACEHOLDER: { view = LayoutInflater.from(parent.getContext()) .inflate(R.layout.material_view_pager_placeholder, parent, false); return new RecyclerView.ViewHolder(view) { }; } default: return mAdapter.onCreateViewHolder(parent, viewType); } } //dispatch onBindViewHolder on the actual mAdapter @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { switch (getItemViewType(position)) { case TYPE_PLACEHOLDER: break; default: mAdapter.onBindViewHolder(holder, position - mPlaceholderSize); break; } } public void mvp_notifyDataSetChanged() { mAdapter.notifyDataSetChanged(); notifyDataSetChanged(); } public void mvp_notifyItemChanged(int position) { mAdapter.notifyItemChanged(position - 1); notifyItemChanged(position); } public void mvp_notifyItemInserted(int position) { mAdapter.notifyItemInserted(position - 1); notifyItemInserted(position); } public void mvp_notifyItemRemoved(int position) { mAdapter.notifyItemRemoved(position - 1); notifyItemRemoved(position); } public void mpv_notifyItemRangeChanged(int startPosition, int itemCount) { mAdapter.notifyItemRangeChanged(startPosition - 1, itemCount - 1); notifyItemRangeChanged(startPosition, itemCount); } public void mpv_notifyItemRangeInserted(int startPosition, int itemCount) { mAdapter.notifyItemRangeInserted(startPosition - 1, itemCount - 1); notifyItemRangeInserted(startPosition, itemCount); } public void mpv_notifyItemRangeRemoved(int startPosition, int itemCount) { mAdapter.notifyItemRangeRemoved(startPosition - 1, itemCount - 1); notifyItemRangeRemoved(startPosition, itemCount); } }