package com.llf.basemodel.recycleview;
import android.content.Context;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import java.util.List;
/**
* Created by llf on 2017/1/3.
* 基础的adapter
*/
public abstract class BaseAdapter<T> extends RecyclerView.Adapter<BaseViewHolder> {
private int itemId;
private Context mContext;
private List<T> datas;
private OnItemClickListener mOnItemClickListener;
private int viewFooter;
private int viewHead;
private View footerView;
private static final int TYPE_NORMAL = 1000;
private static final int TYPE_HEADER = 1001;
private static final int TYPE_FOOTER = 1002;
public BaseAdapter(Context context, int itemId, List<T> datas) {
this.itemId = itemId;
this.mContext = context;
this.datas = datas;
}
public void addHeaderView(int headerView) {
this.viewHead = headerView;
notifyItemInserted(0);
}
public void addFooterView(int footerView) {
this.viewFooter = footerView;
notifyItemInserted(getItemCount() - 1);
}
public void setFooterVisible(int visible) {
footerView.setVisibility(visible);
}
@Override
public BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == TYPE_FOOTER) {
footerView = LayoutInflater.from(mContext).inflate(viewFooter, parent, false);
return new BaseViewHolder(footerView);
} else if (viewType == TYPE_HEADER) {
return new BaseViewHolder(LayoutInflater.from(mContext).inflate(viewHead, parent, false));
} else {
return new BaseViewHolder(LayoutInflater.from(mContext).inflate(itemId, parent, false));
}
}
@Override
public void onBindViewHolder(final BaseViewHolder holder, final int position) {
if (!isHeaderView(position) && !isFooterView(position)) {
if (mOnItemClickListener != null) {
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mOnItemClickListener.onItemClick(viewHead == 0 ? position : position - 1, holder);
}
});
holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
mOnItemClickListener.onItemLongClick(viewHead == 0 ? position : position - 1);
return true;
}
});
}
convert(holder, datas.get(viewHead == 0 ? position : position - 1));
}
}
@Override
public int getItemCount() {
int count = (datas == null ? 0 : datas.size());
if (viewFooter != 0) {
count++;
}
if (viewHead != 0) {
count++;
}
return count;
}
@Override
public int getItemViewType(int position) {
if (isHeaderView(position)) {
return TYPE_HEADER;
} else if (isFooterView(position)) {
return TYPE_FOOTER;
} else {
return TYPE_NORMAL;
}
}
/**
* 处理GridLayoutManager
*/
@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_NORMAL
? 1 : gridManager.getSpanCount();
}
});
}
}
/**
* 处理StaggeredGridLayoutManager
*/
@Override
public void onViewAttachedToWindow(BaseViewHolder holder) {
super.onViewAttachedToWindow(holder);
ViewGroup.LayoutParams lp = holder.itemView.getLayoutParams();
if (lp != null && lp instanceof StaggeredGridLayoutManager.LayoutParams) {
StaggeredGridLayoutManager.LayoutParams p = (StaggeredGridLayoutManager.LayoutParams) lp;
p.setFullSpan(holder.getLayoutPosition() == 0);
}
}
private boolean isHeaderView(int position) {
return viewHead != 0 && position == 0;
}
private boolean isFooterView(int position) {
return viewFooter != 0 && position == getItemCount() - 1;
}
//设置点击事件
public void setOnItemClickLitener(OnItemClickListener mLitener) {
mOnItemClickListener = mLitener;
}
public abstract void convert(BaseViewHolder viewHolder, T item);
public interface OnItemClickListener {
void onItemClick(int position, BaseViewHolder holder);
void onItemLongClick(int position);
}
}