package com.danxx.mdplayer.adapter; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.StaggeredGridLayoutManager; import android.view.View; import android.view.ViewGroup; import java.util.ArrayList; import java.util.List; /** * Created by Danxingxi on 2016/3/31. */ public abstract class BaseRecyclerViewAdapter<T> extends RecyclerView.Adapter<BaseRecyclerViewHolder>{ /**header view type**/ public static final int TYPE_HEADER = 0; /**item view type**/ public static final int TYPE_NORMAL = 1; private View mHeaderView; private OnItemClickListener itemClickListener; private List< T > mData = new ArrayList< T >(); public void setData(List< T > data){ mData.clear(); mData.addAll(data); } public T getItemData(int position) { T res = null; if(position < mData.size()) { res = mData.get(position); } return res; } public void clearData(){ if(mData != null){ mData.clear(); } } public void setOnItemClickListener(OnItemClickListener li) { itemClickListener = li; } /** * add header view * @param headerView */ public void setHeaderView(View headerView) { mHeaderView = headerView; notifyItemInserted(0); } /** * get header view * @return */ public View getHeaderView() { return mHeaderView; } @Override public int getItemViewType(int position) { if(mHeaderView == null) return TYPE_NORMAL; if(position == 0) return TYPE_HEADER; return TYPE_NORMAL; } /** * 获得item的位置 * @param holder * @return */ public int getRealPosition(BaseRecyclerViewHolder holder) { int position = holder.getLayoutPosition(); return mHeaderView == null ? position : position - 1; } @Override public BaseRecyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { if(mHeaderView != null && viewType == TYPE_HEADER) return new HeaderViewHolder(mHeaderView); return createItem(parent ,viewType); } @Override public void onBindViewHolder(final BaseRecyclerViewHolder holder, int position) { /**如果是header view就直接返回,不需要绑定数据**/ if(getItemViewType(position) == TYPE_HEADER) return; final int pos = getRealPosition(holder); final T data = mData.get(pos); bindData(holder ,position); if(itemClickListener != null) { holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { itemClickListener.onItemClick(pos, data); } }); } } @Override public int getItemCount() { return mHeaderView == null ? mData.size() : mData.size() + 1; } @Override public void onAttachedToRecyclerView(RecyclerView recyclerView) { super.onAttachedToRecyclerView(recyclerView); RecyclerView.LayoutManager manager = recyclerView.getLayoutManager(); if(manager instanceof GridLayoutManager) { final GridLayoutManager gridManager = ((GridLayoutManager) manager); gridManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { @Override public int getSpanSize(int position) { return getItemViewType(position) == TYPE_HEADER ? gridManager.getSpanCount() : 1; } }); } } @Override public void onViewAttachedToWindow(BaseRecyclerViewHolder holder) { super.onViewAttachedToWindow(holder); ViewGroup.LayoutParams lp = holder.itemView.getLayoutParams(); if(lp != null && lp instanceof StaggeredGridLayoutManager.LayoutParams && holder.getLayoutPosition() == 0) { StaggeredGridLayoutManager.LayoutParams p = (StaggeredGridLayoutManager.LayoutParams) lp; p.setFullSpan(true); } } /** * 创建item view * @param parent * @param viewType * @return */ protected abstract BaseRecyclerViewHolder createItem(ViewGroup parent, int viewType); /** * 绑定数据 * @param holder * @param position */ protected abstract void bindData(BaseRecyclerViewHolder holder, int position); /** *header view ViewHolder */ class HeaderViewHolder extends BaseRecyclerViewHolder { public HeaderViewHolder(View itemView) { super(itemView); } @Override protected View getView() { return null; } } /** * item 点击事件接口 * @param <T> */ public interface OnItemClickListener<T> { void onItemClick(int position, T data); } }