通过重写RecyclerView.Adapter来实现添加头脚布局的功能
-----具体使用
1 创建adapter继承DBaseRecyclerViewAdapter,实现onCreateViewHolder1()方法,绑定布局
2 创建viewholder继承DBaseRecyclerViewHolder,实现setData()方法,设置页面数据
3 绑定自定义的adapter与DRecyclerViewAdapter
4 添加脚布局
5 设置adapter到recyclerView
---伪代码
MyAdapter myAdapter = new MyAdapter(this, arrayList);
DRecyclerViewAdapter recyclerViewAdapter = new DRecyclerViewAdapter(myAdapter);
GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 3);
gridLayoutManager.setSpanSizeLookup(new DSpanSizeLookup(recyclerViewAdapter, gridLayoutManager.getSpanCount() - 2));
recyclerView.setLayoutManager(gridLayoutManager);
((DefaultItemAnimator) recyclerView.getItemAnimator()).setSupportsChangeAnimations(false);
recyclerViewAdapter.addFootView(view1);
recyclerView.setAdapter(recyclerViewAdapter);
---继承自RecyclerView.Adapter的类
public abstract class DBaseRecyclerViewAdapter<T> extends RecyclerView.Adapter<DBaseRecyclerViewHolder> {
private List<T> mDatas;
private Context mContext;
/**
* 默认点击监听事件
*/
public interface OnClickItemListener {
void onClick(int poisiton);
}
OnClickItemListener onClickItemListsner;
public void setOnClickItemListsner(OnClickItemListener onClickItemListsner) {
this.onClickItemListsner = onClickItemListsner;
}
public OnClickItemListener getOnClickItemListsner() {
return onClickItemListsner;
}
private DRecyclerViewAdapter mDRecyclerViewAdapter;
public DRecyclerViewAdapter getmDRecyclerViewAdapter() {
return mDRecyclerViewAdapter;
}
public void setDRecyclerViewAdapter(DRecyclerViewAdapter mDRecyclerViewAdapter) {
this.mDRecyclerViewAdapter = mDRecyclerViewAdapter;
}
private DRecyclerViewAdapter dRecyclerViewAdapter;
public DBaseRecyclerViewAdapter(List<T> mDatas, Context mContext) {
this.mDatas = mDatas;
this.mContext = mContext;
}
@Override
public DBaseRecyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return onCreateViewHolder1(parent, viewType);
}
protected abstract DBaseRecyclerViewHolder onCreateViewHolder1(ViewGroup parent, int viewType);
@Override
public void onBindViewHolder(DBaseRecyclerViewHolder holder, int position) {
holder.setData(mDatas.get(position), position);
}
@Override
public int getItemCount() {
return mDatas.size();
}
public boolean isHeader(int position) {
return getHeaderViewsCount() > 0 && position < getHeaderViewsCount();
}
public boolean isFooter(int position) {
int lastPosition = getItemCount() - 1;
return getFooterViewsCount() > 0 && position > lastPosition - getFooterViewsCount() && position <= lastPosition;
}
private int getFooterViewsCount() {
return mDRecyclerViewAdapter.getFootSize();
}
public int getHeaderViewsCount() {
return mDRecyclerViewAdapter.getHeadSize();
}
}
----继承自RecyclerView.ViewHolder的viewHolder
public abstract class DBaseRecyclerViewHolder<T> extends RecyclerView.ViewHolder {
private DBaseRecyclerViewAdapter dBaseRecyclerViewAdapter;
private DRecyclerViewAdapter mDRecyclerViewAdapter;
DBaseRecyclerViewAdapter.OnClickItemListener onClickItemListsner;
public DBaseRecyclerViewAdapter.OnClickItemListener getOnClickItemListsner() {
return onClickItemListsner;
}
public DBaseRecyclerViewHolder(View itemView, DBaseRecyclerViewAdapter dBaseRecyclerViewAdapter) {
super(itemView);
this.dBaseRecyclerViewAdapter = dBaseRecyclerViewAdapter;
mDRecyclerViewAdapter = dBaseRecyclerViewAdapter.getmDRecyclerViewAdapter();
onClickItemListsner = dBaseRecyclerViewAdapter.getOnClickItemListsner();
}
public DBaseRecyclerViewHolder(ViewGroup parent, @LayoutRes int res, DBaseRecyclerViewAdapter dBaseRecyclerViewAdapter) {
super(LayoutInflater.from(parent.getContext()).inflate(res, parent, false));
mDRecyclerViewAdapter = dBaseRecyclerViewAdapter.getmDRecyclerViewAdapter();
this.dBaseRecyclerViewAdapter = dBaseRecyclerViewAdapter;
onClickItemListsner = dBaseRecyclerViewAdapter.getOnClickItemListsner();
}
protected <T extends View> T $(@IdRes int id) {
return (T) itemView.findViewById(id);
}
public abstract void setData(T data, int position);
//
// /**
// * 处理有头部和尾部的情况 返回点击的位置
// * @return
// */
// /**
// * 获取点击的item的position
// *
// * @return
// */
// public int getAdapterItemPosition()
// {
// int oldPosition = getAdapterPosition();
//
// if (dBaseRecyclerViewAdapter == null)
// {
// return oldPosition;
// }
//
// if (dBaseRecyclerViewAdapter.isHeader(oldPosition) || dBaseRecyclerViewAdapter.isFooter(oldPosition))
// {
// return - 1;
// }
// else
// {
// return oldPosition - dBaseRecyclerViewAdapter.getHeaderViewsCount();
// }
// }
}
-----DRecyclerViewAdapter类的方法
public class DRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
public static final String Tag = DRecyclerViewAdapter.class.getName();
private RecyclerView.Adapter mInnerAdapter;
public DRecyclerViewAdapter(DBaseRecyclerViewAdapter adapter) {
setAdapter(adapter);
}
public void setAdapter(DBaseRecyclerViewAdapter myAdapter) {
if (myAdapter != null) {
if (! (myAdapter instanceof RecyclerView.Adapter))
throw new RuntimeException("your adapter must be a RecyclerView.Adapter");
}
this.mInnerAdapter = myAdapter;
myAdapter.setDRecyclerViewAdapter(this);
}
/**
* head foot list cache
*/
private List<View> mHeadViews = new ArrayList<View>();
private List<View> mFootViews = new ArrayList<View>();
private List<View> mRandomViews = new ArrayList<View>();
private SparseArray<Integer> mRandomViews_position = new SparseArray<Integer>();
/**
* addHead to recyclerview
*
* @param view
*/
public void addHeadView(View view) {
mHeadViews.add(view);
}
/**
* addFoot to RecyclerView
*
* @param view
*/
public void addFootView(View view) {
mFootViews.add(view);
}
/**
* 使用一次 存下来 后续 好查找
*/
private int index = 0;
public void addRandomView(View view, int posistion) {
mRandomViews_position.append(posistion, index);
index++;
mRandomViews.add(view);
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
DRecyclerViewHolder dRecyclerViewHolder;
if (viewType < mHeadViews.size()) {
Log.e(Tag, "headView" + viewType);
return new DRecyclerViewHolder(mHeadViews.get(viewType));
}
else if (viewType >= mHeadViews.size() && viewType < mHeadViews.size() + mInnerAdapter.getItemCount()) {
if (mRandomViews_position.get(viewType - mHeadViews.size()) != null) {
View view = mRandomViews.get(mRandomViews_position.get(viewType - mHeadViews.size()));
return new DRecyclerViewHolder(view);
}
return mInnerAdapter.onCreateViewHolder(parent, viewType - mHeadViews.size());
}
else {
int position = viewType - mHeadViews.size() - mInnerAdapter.getItemCount();
if (position >= 0 && position < mFootViews.size()) {
return new DRecyclerViewHolder(mFootViews.get(position));
}
else {
return null;
}
}
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if (position >= mHeadViews.size() && position < mHeadViews.size() + mInnerAdapter.getItemCount()) {
//不包括那些插入的
if (mRandomViews_position.get(position - mHeadViews.size()) == null)
mInnerAdapter.onBindViewHolder(holder, position - mHeadViews.size());
}
else {
/**
* 瀑布流的设置处理
*/
ViewGroup.LayoutParams layoutParams = holder.itemView.getLayoutParams();
if (layoutParams instanceof StaggeredGridLayoutManager.LayoutParams) {
((StaggeredGridLayoutManager.LayoutParams) layoutParams).setFullSpan(true);
}
}
}
@Override
public int getItemCount() {
return mHeadViews.size() + mInnerAdapter.getItemCount() + mFootViews.size();
}
@Override
public int getItemViewType(int position) {
return position;
}
public int getFootSize() {
return mFootViews.size();
}
public int getHeadSize() {
return mHeadViews.size();
}
public boolean isHeader(int position) {
return position < mHeadViews.size() ? true : false;
}
public boolean isFooter(int position) {
return position >= mHeadViews.size() + mInnerAdapter.getItemCount() ? true : false;
}
public boolean isRandom(int position) {
return mRandomViews_position.get(position - mHeadViews.size()) != null ? true : false;
}
static class DRecyclerViewHolder extends RecyclerView.ViewHolder {
public DRecyclerViewHolder(View itemView) {
super(itemView);
}
}
}