Activity:
private void setHeaderView(RecyclerView view){
View header = LayoutInflater.from(this).inflate(R.layout.header, view, false);
mAdapter.setHeaderView(header);
}
private void setFooterView(RecyclerView view){
View footer = LayoutInflater.from(this).inflate(R.layout.footer, view, false);
mAdapter.setFooterView(footer);
}
//独占一行
GridLayoutManager gridLayoutManager = new GridLayoutManager(
this,3,LinearLayoutManager.VERTICAL,false);//设置列数
gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
if (position==0 || position == mDatas.size()+1){
return 3;
}else {
return 1;
}
}
});
Adapter:
public static final int TYPE_HEADER = 0;//有header
public static final int TYPE_FOOTER = 1;//有footer
public static final int TYPE_NORMAL = 2;//没有header和footer
private View mHeaderView;
private View mFooterView;
public View getHeaderView() {
return mHeaderView;
}
public void setHeaderView(View headerView) {
mHeaderView = headerView;
notifyItemInserted(0);
}
public View getFooterView() {
return mFooterView;
}
public void setFooterView(View footerView) {
mFooterView = footerView;
notifyItemInserted(getItemCount() - 1);
}
// 重写这个方法,很重要,是加入Header和Footer的关键,我们通过判断item的类型,从而绑定不同的view
@Override
public int getItemViewType(int position) {
if (mHeaderView == null && mFooterView == null) {
return TYPE_NORMAL;
}
if (position == 0) {
//第一个item应该加载Header
return TYPE_HEADER;
}
if (position == getItemCount() - 1) {
//最后一个,应该加载Footer
return TYPE_FOOTER;
}
return TYPE_NORMAL;
}
//重写onCreateViewHolder方法,返回一个自定义的ViewHolder
//创建View,如果是HeaderView或者是FooterView,直接在Holder中返回
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.item_home, parent, false);
if (mHeaderView != null && viewType == TYPE_HEADER) {
return new ViewHolder(mHeaderView);
}
if (mFooterView != null && viewType == TYPE_FOOTER) {
return new ViewHolder(mFooterView);
}
return new ViewHolder(view);
}
//填充onCreateViewHolder方法返回的holder中的控件
//绑定View,这里是根据返回的这个position的类型,从而进行绑定的, HeaderView和FooterView, 就不同绑定了
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if (getItemViewType(position) == TYPE_NORMAL) {
if (holder instanceof ViewHolder) {
//这里加载数据的时候要注意,是从position-1开始,因为position==0已经被header占用了
((ViewHolder) holder).tvId.setText(mDatas.get(position - 1));
return;
}
return;
} else if (getItemViewType(position) == TYPE_HEADER) {
return;
} else {
return;
}
}
//在这里面加载ListView中的每个item的布局
class ViewHolder extends RecyclerView.ViewHolder {
TextView tvId;
public ViewHolder(View view) {
super(view);
//如果是headerview或者是footerview,直接返回
if (view == mHeaderView) {
return;
}
if (view == mFooterView) {
return;
}
tvId = (TextView) view.findViewById(R.id.tvId);
}
}
@Override
public int getItemCount() {
// if(mHeaderView == null && mFooterView == null){
// return mDatas.size();
// }else if(mHeaderView == null && mFooterView != null){
// return mDatas.size() + 1;
// }else if (mHeaderView != null && mFooterView == null){
// return mDatas.size() + 1;
// }else {
// return mDatas.size() + 2;
// }
int size = mDatas.size() + 2;
if (mHeaderView == null) {
size -= 1;
}
if (mFooterView == null) {
size -= 1;
}
return size;
}
private void setHeaderView(RecyclerView view){
View header = LayoutInflater.from(this).inflate(R.layout.header, view, false);
mAdapter.setHeaderView(header);
}
private void setFooterView(RecyclerView view){
View footer = LayoutInflater.from(this).inflate(R.layout.footer, view, false);
mAdapter.setFooterView(footer);
}
//独占一行
GridLayoutManager gridLayoutManager = new GridLayoutManager(
this,3,LinearLayoutManager.VERTICAL,false);//设置列数
gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
if (position==0 || position == mDatas.size()+1){
return 3;
}else {
return 1;
}
}
});
Adapter:
public static final int TYPE_HEADER = 0;//有header
public static final int TYPE_FOOTER = 1;//有footer
public static final int TYPE_NORMAL = 2;//没有header和footer
private View mHeaderView;
private View mFooterView;
public View getHeaderView() {
return mHeaderView;
}
public void setHeaderView(View headerView) {
mHeaderView = headerView;
notifyItemInserted(0);
}
public View getFooterView() {
return mFooterView;
}
public void setFooterView(View footerView) {
mFooterView = footerView;
notifyItemInserted(getItemCount() - 1);
}
// 重写这个方法,很重要,是加入Header和Footer的关键,我们通过判断item的类型,从而绑定不同的view
@Override
public int getItemViewType(int position) {
if (mHeaderView == null && mFooterView == null) {
return TYPE_NORMAL;
}
if (position == 0) {
//第一个item应该加载Header
return TYPE_HEADER;
}
if (position == getItemCount() - 1) {
//最后一个,应该加载Footer
return TYPE_FOOTER;
}
return TYPE_NORMAL;
}
//重写onCreateViewHolder方法,返回一个自定义的ViewHolder
//创建View,如果是HeaderView或者是FooterView,直接在Holder中返回
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.item_home, parent, false);
if (mHeaderView != null && viewType == TYPE_HEADER) {
return new ViewHolder(mHeaderView);
}
if (mFooterView != null && viewType == TYPE_FOOTER) {
return new ViewHolder(mFooterView);
}
return new ViewHolder(view);
}
//填充onCreateViewHolder方法返回的holder中的控件
//绑定View,这里是根据返回的这个position的类型,从而进行绑定的, HeaderView和FooterView, 就不同绑定了
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if (getItemViewType(position) == TYPE_NORMAL) {
if (holder instanceof ViewHolder) {
//这里加载数据的时候要注意,是从position-1开始,因为position==0已经被header占用了
((ViewHolder) holder).tvId.setText(mDatas.get(position - 1));
return;
}
return;
} else if (getItemViewType(position) == TYPE_HEADER) {
return;
} else {
return;
}
}
//在这里面加载ListView中的每个item的布局
class ViewHolder extends RecyclerView.ViewHolder {
TextView tvId;
public ViewHolder(View view) {
super(view);
//如果是headerview或者是footerview,直接返回
if (view == mHeaderView) {
return;
}
if (view == mFooterView) {
return;
}
tvId = (TextView) view.findViewById(R.id.tvId);
}
}
@Override
public int getItemCount() {
// if(mHeaderView == null && mFooterView == null){
// return mDatas.size();
// }else if(mHeaderView == null && mFooterView != null){
// return mDatas.size() + 1;
// }else if (mHeaderView != null && mFooterView == null){
// return mDatas.size() + 1;
// }else {
// return mDatas.size() + 2;
// }
int size = mDatas.size() + 2;
if (mHeaderView == null) {
size -= 1;
}
if (mFooterView == null) {
size -= 1;
}
return size;
}