RecyclerView 水平多行排列添加头和尾
import android.content.Context;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import java.util.List;
/**
* Created by guanyueyun on 2016/11/17.
*/
public abstract class HeaderFooterRecyclerAdapter<T> extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private int verticalItem;//垂直item
private int horizontalItem;//水平item
private int verticalHeaderItem;//垂直时的头
private int horizontalHeaderItem;//水平时头布局
private int verticalFooterItem;//垂直时的尾
private int horizontalFooterItem;//水平时的尾
public void setVerticalItem(int verticalItem) {
this.verticalItem = verticalItem;
}
public void setHorizontalItem(int horizontalItem) {
this.horizontalItem = horizontalItem;
}
public void setVerticalHeaderItem(int verticalHeaderItem) {
this.verticalHeaderItem = verticalHeaderItem;
}
public void setHorizontalHeaderItem(int horizontalHeaderItem) {
this.horizontalHeaderItem = horizontalHeaderItem;
}
public void setVerticalFooterItem(int verticalFooterItem) {
this.verticalFooterItem = verticalFooterItem;
}
public void setHorizontalFooterItem(int horizontalFooterItem) {
this.horizontalFooterItem = horizontalFooterItem;
}
private int mNowItemLayoutID;
private int mNowHeaderLayoutID;
private int mNowFooterLayoutID;
public static final int TYPE_HEADER = 0;
public static final int TYPE_FOOTER = 1;
public static final int TYPE_NORMAL = 2;
private static final String TAG = "HeaderRecyclerAdapter";
protected List<T> mDataList;
private Context mContext;
public HeaderFooterRecyclerAdapter(List<T> dataList,RecyclerView recyclerView, int mItemLayoutId) {
mDataList = dataList;
mContext=recyclerView.getContext();
mRecyclerView=recyclerView;
if (mItemLayoutId==0){
return;
}
verticalItem=mItemLayoutId;
horizontalItem=mItemLayoutId;
}
RecyclerView mRecyclerView;
private View mHeaderView;
private View mFooterView;
/**
* 设置头布局
* @param headerViewLayoutID
*/
public void setHeaderView(int headerViewLayoutID) {
dealHeaderFooterLayoutType();
headerViewLayoutID=headerViewLayoutID==0?mNowHeaderLayoutID:headerViewLayoutID;
/**注意 root view 为recycleview*/
View headerView = LayoutInflater.from(mContext).inflate(headerViewLayoutID,mRecyclerView,false);
mHeaderView = headerView;
notifyItemInserted(0);
}
/**
*设置头布局
* @param headerView
*/
public void setHeaderView(View headerView) {
mHeaderView = headerView;
notifyItemInserted(0);
}
/**
* 获取头布局视图对象
* @return
*/
public View getHeaderView() {
return mHeaderView;
}
/**
* 设置尾布局
* @param footerViewLayoutID
*/
public void setFooterView(int footerViewLayoutID) {
dealHeaderFooterLayoutType();
footerViewLayoutID=footerViewLayoutID==0?mNowFooterLayoutID:footerViewLayoutID;
View footerView = LayoutInflater.from(mContext).inflate(footerViewLayoutID,mRecyclerView,false);
mFooterView = footerView;
notifyItemInserted(getItemCount() - 1);
}
/**
* 设置尾布局
* @param footerView
*/
public void setFooterView(View footerView) {
mFooterView = footerView;
notifyItemInserted(getItemCount() - 1);
}
/**
* 获取尾布局对象
* @return
*/
public View getFooterView() {
return mFooterView;
}
/**
* 更新数据源
* @param dataList
*/
public void refreshDataList(List<T> dataList) {
mDataList.clear();
mDataList.addAll(dataList);
notifyDataSetChanged();
}
/**
* 数据源天加新数据
* @param dataList
*/
public void appendDataList(List<T> dataList) {
mDataList.addAll(dataList);
notifyDataSetChanged();
}
@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);
//为GridLayoutManager 合并头布局的跨度
RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
if (layoutManager instanceof GridLayoutManager) {
final GridLayoutManager gridLayoutManager = (GridLayoutManager) layoutManager;
gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
/**
* 抽象方法 返回当前index位置的item所占用的跨度的数量
* ##单元格合并 就是相当于占据了设定列spanCount的数量
* ##不合并 就是相当于占据了原来1个跨度
*
* @param position
* @return
*/
@Override
public int getSpanSize(int position) {
int i = (getItemViewType(position) == TYPE_HEADER || getItemViewType(position) == TYPE_FOOTER) ? gridLayoutManager.getSpanCount() : 1;
return i;
}
});
//
mNowItemLayoutID = gridLayoutManager.getOrientation() == GridLayoutManager.HORIZONTAL
? horizontalItem : verticalItem;
//
} else if (layoutManager instanceof StaggeredGridLayoutManager) {
StaggeredGridLayoutManager staggeredGridLayoutManager = (StaggeredGridLayoutManager) layoutManager;
mNowItemLayoutID = staggeredGridLayoutManager.getOrientation() == StaggeredGridLayoutManager.HORIZONTAL
? horizontalItem : verticalItem;
} else if (layoutManager instanceof LinearLayoutManager) {
LinearLayoutManager linearLayoutManager = (LinearLayoutManager) layoutManager;
mNowItemLayoutID = linearLayoutManager.getOrientation() == LinearLayoutManager.HORIZONTAL
?horizontalItem : verticalItem;
}
}
@Override
public int getItemViewType(int position) {
if (mHeaderView != null && mFooterView != null) {
if (position == 0) {
return TYPE_HEADER;
}
if (position == getItemCount() - 1) {
return TYPE_FOOTER;
}
return TYPE_NORMAL;
} else if (mHeaderView != null) {
if (position == 0) {
return TYPE_HEADER;
}
return TYPE_NORMAL;
} else if (mFooterView != null) {
if (position == getItemCount() - 1) {
return TYPE_FOOTER;
}
return TYPE_NORMAL;
}
return TYPE_NORMAL;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (mHeaderView != null && viewType == TYPE_HEADER) {
return new HeaderFooterRecyclerViewHolder(mHeaderView);
}
if (mFooterView != null && viewType == TYPE_FOOTER) {
return new HeaderFooterRecyclerViewHolder(mFooterView);
}
View view = LayoutInflater.from(parent.getContext()).inflate(mNowItemLayoutID, parent, false);
return new HeaderFooterRecyclerViewHolder(view);
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) {
ViewGroup.LayoutParams vg_lp = viewHolder.itemView.getLayoutParams();
if (vg_lp != null && vg_lp instanceof StaggeredGridLayoutManager.LayoutParams) {
StaggeredGridLayoutManager.LayoutParams sglm_lp = (StaggeredGridLayoutManager.LayoutParams) vg_lp;
if (getItemViewType(position) == TYPE_HEADER) {
sglm_lp.setFullSpan(position == 0);
}
if (getItemViewType(position) == TYPE_FOOTER) {
sglm_lp.setFullSpan(position == getItemCount() - 1);
}
}
int itemType = getItemViewType(position);
if (itemType == TYPE_HEADER || itemType == TYPE_FOOTER) {
return;
}
int realPos = position;
if (mHeaderView != null) {
realPos = position - 1;
}
final int pos = realPos;
final T data = mDataList.get(pos);
onBindViewHolderInner(viewHolder, pos, data);
viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(onItemClickListener != null) {
onItemClickListener.onItemClick(v,pos, data);
}
}
});
}
public void dealHeaderFooterLayoutType(){
/**单独为HORIZONTAL 设置左侧的布局 右侧布局*/
RecyclerView.LayoutManager layoutManager=mRecyclerView.getLayoutManager();
if (layoutManager instanceof StaggeredGridLayoutManager){
StaggeredGridLayoutManager staggeredGridLayoutManager= (StaggeredGridLayoutManager) layoutManager;
mNowHeaderLayoutID=staggeredGridLayoutManager.getOrientation()==StaggeredGridLayoutManager.HORIZONTAL
?horizontalHeaderItem :verticalHeaderItem;
mNowFooterLayoutID=staggeredGridLayoutManager.getOrientation()==StaggeredGridLayoutManager.HORIZONTAL
?horizontalFooterItem :verticalFooterItem;
}else if (layoutManager instanceof GridLayoutManager){
GridLayoutManager gridLayoutManager= (GridLayoutManager) layoutManager;
mNowHeaderLayoutID=gridLayoutManager.getOrientation()==GridLayoutManager.HORIZONTAL
?horizontalHeaderItem :verticalHeaderItem;
mNowFooterLayoutID=gridLayoutManager.getOrientation()==GridLayoutManager.HORIZONTAL
?horizontalFooterItem :verticalFooterItem;
}else if (layoutManager instanceof LinearLayoutManager){
LinearLayoutManager linearLayoutManager= (LinearLayoutManager) layoutManager;
mNowHeaderLayoutID=linearLayoutManager.getOrientation()==LinearLayoutManager.HORIZONTAL
?horizontalHeaderItem :verticalHeaderItem;
mNowFooterLayoutID=linearLayoutManager.getOrientation()==LinearLayoutManager.HORIZONTAL
?horizontalFooterItem :verticalFooterItem;
}
}
public abstract void onBindViewHolderInner(RecyclerView.ViewHolder viewHolder, int realPosition, T data);
@Override
public int getItemCount() {
if (mHeaderView != null && mFooterView != null) {
return mDataList.size() + 1 + 1;
} else if (mHeaderView != null) {
return mDataList.size() + 1;
} else if (mFooterView != null) {
return mDataList.size() + 1;
}
return mDataList.size();
}
public interface OnItemClickListener {
void onItemClick(View itemView, int position, Object data);
}
private OnItemClickListener onItemClickListener;
public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
this.onItemClickListener = onItemClickListener;
}
}
封装ViewHolder
package com.guanyueyun.mylook.adapter;
import android.support.v7.widget.RecyclerView;
import android.util.SparseArray;
import android.view.View;
/**
*
*/
public class HeaderFooterRecyclerViewHolder extends RecyclerView.ViewHolder{
private SparseArray<View> mViewSparseArray = new SparseArray<>();
private View mItemView;
public HeaderFooterRecyclerViewHolder(View itemView) {
super(itemView);
mItemView=itemView;
}
public <T extends View> T onBindView(int viewId) {
View view = mViewSparseArray.get(viewId);
if (view == null) {
view = mItemView.findViewById(viewId);
mViewSparseArray.put(viewId, view);
}
return (T) view;
}
}
下面是自己适配器
package com.guanyueyun.mylook.adapter;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.widget.ImageView;
import android.widget.TextView;
import com.guanyueyun.mylook.R;
import com.guanyueyun.mylook.bean.GoodsListInfo;
import com.squareup.picasso.Picasso;
import java.util.List;
/**
* Created by Administrator on 2016/11/17.
*/
public class HomeHeaderAdapter extends HeaderFooterRecyclerAdapter{
private Context context;
/**
*
* @param dataList 数据源
* @param recyclerView
* @param mItemLayoutId item
*/
public HomeHeaderAdapter(List dataList, RecyclerView recyclerView, int mItemLayoutId) {
super(dataList, recyclerView, mItemLayoutId);
//设置中间布局
this.context = recyclerView.getContext();
}
@Override
public void onBindViewHolderInner(RecyclerView.ViewHolder viewHolder, int position, Object data) {
GoodsListInfo.SkuBean skuBean = (GoodsListInfo.SkuBean) mDataList.get(position);
if(viewHolder instanceof HeaderFooterRecyclerViewHolder) {
HeaderFooterRecyclerViewHolder holder= (HeaderFooterRecyclerViewHolder) viewHolder;
ImageView itemIv=holder.onBindView(R.id.item_homegoodslist_item_iv);
TextView itemtv=holder.onBindView(R.id.item_homegoodslist_item_tv);
Picasso.with(context).load(skuBean.getImages().get(0).getUrl()).into(itemIv);
itemtv.setText(skuBean.getPrice2().getValue_display());
}
}
}
接下来就是添加数据源添加头和尾
RecyclerView recyclerView = holder.itemHomeGoodslistRecyclerview;
LinearLayoutManager layoutManager = new LinearLayoutManager(context);
//设置布局管理器 GridLayoutManager.HORIZONTAL
recyclerView.setLayoutManager(new GridLayoutManager(context,2, GridLayoutManager.HORIZONTAL,false));
// //设置为垂直布局,这也是默认的
// layoutManager.setOrientation(OrientationHelper.HORIZONTAL);
HomeGoodsListAdapter recycleAdapter = new HomeGoodsListAdapter(info.getSku(),context);
HomeHeaderAdapter adapter = new HomeHeaderAdapter(info.getSku(),recyclerView,R.layout.item_homegoodslist_item);
//设置头布局
adapter.setHeaderView(R.layout.item_homegoodslist_header);
View headerView = adapter.getHeaderView();//获取头布局视图对象
ImageView headerViewIv = (ImageView) headerView.findViewById(R.id.item_home_selectd_header);
Picasso.with(context).load(info.getSku().get(0).getImages().get(0).getUrl()).into(headerViewIv);
//设置尾布局
// adapter.setFooterView(R.layout.item_homegoodslist_header);
//设置Adapter
recyclerView.setAdapter(adapter);
//设置增加或删除条目的动画
recyclerView.setItemAnimator( new DefaultItemAnimator());