本文主要介绍如何给RecyclerView添加自定义的头部和底部(header和footer),主要步骤如下:
1. 定义两个viewholder,分别用于头部和底部,名称自定
public class HeadViewHolder extends RecyclerView.ViewHolder {
public HeadViewHolder(@NonNull View itemView) {
super(itemView);
}
}
public class FootViewHolder extends RecyclerView.ViewHolder {
TextView tv_foot;
public FootViewHolder(@NonNull View itemView) {
super(itemView);
tv_foot=itemView.findViewById(R.id.tv_foot);
}
}
2. 重写adapter中的getItemViewType(),onCreateViewHolder(),onBindViewHolder(),getItemCount()等几个方法。
其中,getItemViewType()主要用来区分不同类型的item,如果我们使用RecyclerView的时候只是需要简单的展示数据就不需要重写这个方法。其他几个方法在重写的时候和平时也有一些不太一样的地方,这个会在接下来的代码中体现。
首先在adapter中定义几个常量,用来区分不同的视图类型
public static final int TYPE_HEAD_VIEW = 0;//头部header
public static final int TYPE_CONTENT_VIEW = 1;/中间内容
public static final int TYPE_FOOTER_VIEW = 2;//底部footer
public static final int TYPE_EMPTY_VIEW = 3;//空视图
重写getItemViewType()
//HEADER_COUNT、FOOTER_COUNT为头部和底部view的个数
if(HEADER_COUNT!=0&&position<HEADER_COUNT){//第一个item
return TYPE_HEAD_VIEW;
}else if(FOOTER_COUNT!=0&&position>=(HEADER_COUNT+list.size())){//最后一个item
return TYPE_FOOTER_VIEW;
}else{//中间列表内容tiem
return TYPE_CONTENT_VIEW;
}
由于我们要同时展示header和footer,这样就相当于整个recycleview顶部和底部各自增加了一个item,所以需要重getItemCount,在内容列表数量的基础上将数量+2
public int getItemCount() {
return list.size()+2;
}
接下来需要重写onCreateViewHolder和onBindViewHolder,在onCreateViewHolder中,需要根绝item类型的不同创建不同的viewholder
if(i==TYPE_HEAD_VIEW){
View head=LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.layout_head_view,viewGroup,false);
return new HeadViewHolder(head);
}else if(i==TYPE_EMPTY_VIEW){
View view=LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.empty_layout,viewGroup,false);
return new EmptyViewHolder(view);
}else if(i==TYPE_CONTENT_VIEW){
View view=LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_home,viewGroup,false);
return new HomeViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int i) {
if(viewHolder instanceof HomeViewHolder){// 显示内容列表
((HomeViewHolder)viewHolder).textView.setText(list.get(i-1));
}
}
大概的步骤就是这样了,可以运行起来试一试。