package com.forezp.banya.base;
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;
/**
*
*
*/
public abstract class EasyRecyclerViewAdapter<T> extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private static final int TYPE_HEAD = 0;
private static final int TYPE_BODY = 1;
private static final int TYPE_FOOT = 2;
private View mHeaderView;
private View mFooterView;
private List<T> mDatas = new ArrayList<>();
private OnItemClickListener mItemClickListener;
private OnItemLongClickListener mItemLongClickListener;
public void setOnItemClickListener(OnItemClickListener listener) {
mItemClickListener = listener;
}
public void setOnItemLongClickListener(OnItemLongClickListener listener) {
mItemLongClickListener = listener;
}
public void setHeaderView(View headerView) {
mHeaderView = headerView;
notifyItemInserted(0);
}
public void setFooterView(View footerView) {
mFooterView = footerView;
// notifyItemInserted(getFooterPosition());
notifyDataSetChanged();
}
public void setDatas(List<T> mDatas) {
this.mDatas = mDatas;
notifyDataSetChanged();
}
public EasyRecyclerViewAdapter(List<T> mDatas) {
this.mDatas = mDatas;
}
public EasyRecyclerViewAdapter() {
}
@Override
public int getItemViewType(int position) {
if (mFooterView == null && mHeaderView == null) {
return TYPE_BODY;
}
if (mHeaderView != null && position == 0) {
return TYPE_HEAD;
}
if (mFooterView != null && mHeaderView == null && position == mDatas.size()) {
return TYPE_FOOT;
}
if (mFooterView != null && mHeaderView != null && position == mDatas.size() + 1) {
return TYPE_FOOT;
}
return TYPE_BODY;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == TYPE_HEAD) {
return new EasyViewHolder(mHeaderView);
}
if (viewType == TYPE_FOOT) {
return new EasyViewHolder(mFooterView);
}
return onCreate(parent, viewType);//获取资源文件
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if (getItemViewType(position) == TYPE_HEAD || getItemViewType(position) == TYPE_FOOT) {
return;
}
final int dataPosition = getDataPosition(holder);
final T data = mDatas.get(dataPosition);
onBind(holder, dataPosition, data);
if (mItemClickListener != null) {
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mItemClickListener.OnItemClick(v, dataPosition, data);
}
});
}
if (mItemLongClickListener != null) {
holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
mItemLongClickListener.OnItemLongClick(v, dataPosition, data);
return true;
}
});
}
}
@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);
final RecyclerView.LayoutManager layoutParams = recyclerView.getLayoutManager();
if (layoutParams instanceof GridLayoutManager) {
((GridLayoutManager) layoutParams).setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
int type = getItemViewType(position);
if (type == TYPE_HEAD || type == TYPE_FOOT)
return ((GridLayoutManager) layoutParams).getSpanCount();
return 1;
}
});
}
}
@Override
public void onViewAttachedToWindow(RecyclerView.ViewHolder holder) {
super.onViewAttachedToWindow(holder);
ViewGroup.LayoutParams layoutParams = holder.itemView.getLayoutParams();
if (layoutParams instanceof StaggeredGridLayoutManager.LayoutParams) {
StaggeredGridLayoutManager.LayoutParams params = (StaggeredGridLayoutManager.LayoutParams) layoutParams;
if (mHeaderView != null && holder.getLayoutPosition() == 0) {
params.setFullSpan(true);
} else if (mFooterView != null && holder.getLayoutPosition() == getFooterPosition()) {
params.setFullSpan(true);
} else {
params.setFullSpan(false);
}
}
}
public int getDataPosition(RecyclerView.ViewHolder holder) {
int position = holder.getLayoutPosition();
return mHeaderView == null ? position : position - 1;
}
private int getFooterPosition() {
if (mFooterView == null) {
return -1;
}
if (mHeaderView == null) {
return mDatas.size();
}
if (mHeaderView != null) {
return mDatas.size() + 1;
}
return -1;
}
@Override
public int getItemCount() {
if (mFooterView != null && mHeaderView != null) {
return mDatas.size() + 2;
} else if (mFooterView != null || mHeaderView != null) {
return mDatas.size() + 1;
}
return mDatas.size();
}
public abstract RecyclerView.ViewHolder onCreate(ViewGroup parent, final int viewType);
public abstract void onBind(RecyclerView.ViewHolder viewHolder, int RealPosition, T data);
public class EasyViewHolder extends RecyclerView.ViewHolder {
public EasyViewHolder(View itemView) {
super(itemView);
}
}
public interface OnItemClickListener<T> {
public void OnItemClick(View view, int position, T data);
}
interface OnItemLongClickListener<T> {
public void OnItemLongClick(View view, int position, T data);
}
public List<T> getmDatas() {
return mDatas;
}
}