Android设置RecyclerView的Header和Footer

  • getItemViewType方法设置相应条目的显示位置
  • ViewHolder类返回不同的视图
  • onBindViewHolder方法对不同条目做出不同的处理
  • getItemCount()方法根据不同的返回设置相对应的条目数
  • 在Activity或Fragment中设置加载的头和脚
  • 适配器完整代码
  • 效果

getItemViewType方法设置相应条目的显示位置

    //定义常量 判断RecyclerView具体的加载方式public static final int TYPE_NORMAL = 0; //说明是不带有header和footer的public static final int TYPE_HEADER = 1; //说明是带有Header的public static final int TYPE_FOOTER = 2; //说明是带有Footer的//将视图同条目位置进行匹配@Overridepublic int getItemViewType(int position) {//如果都不存在 返回的视图类型为常规适配器 正常就可 不需要特殊加载if(mHeaderView == null && mFooterView == null){return TYPE_NORMAL;}//设置不同View视图的位置 (有头时)且是在第一个条目时 返回对应的布局if(mHeaderView != null && position == 0){return TYPE_HEADER;}//设置不同View视图的位置 (有脚时)且在最后一个条目时 返回对应的布局if(mFooterView != null && position == getItemCount() - 1){return TYPE_FOOTER;}return TYPE_NORMAL;}

ViewHolder类返回不同的视图

//根据加载方式 来加载对应的视图 RecyclerView必然加载

    //首先要有相对应的视图@NonNull@Overridepublic ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {//if(mHeaderView != null && viewType == TYPE_HEADER){return new ViewHolder(mHeaderView);}if (mFooterView != null && viewType == TYPE_FOOTER){return new ViewHolder(mFooterView);}View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_floor,parent,false);return new ViewHolder(view);}

onBindViewHolder方法对不同条目做出不同的处理

        //正常方式处理if(getItemViewType(position) == TYPE_NORMAL){//判断类型是否相匹配if(holder instanceof ViewHolder){//注意此时第0个条目已经被占据 因此要从position-1 来加载集合数据FloorBean.DataBean dataBean = message.get(position-1);Glide.with(context).load(dataBean.getFloor_title().getImage_src()).into(holder.getImgTitle());List<FloorBean.DataBean.Commodity> product_list = dataBean.getProduct_list();ArrayList<String> imgUilList = new ArrayList<>();for(FloorBean.DataBean.Commodity commodity : product_list){imgUilList.add(commodity.getImage_src());}ImageView[] imgs  = {holder.getImgOne(),holder.getImgTwo(),holder.getImgThree(),holder.getImgFour(),holder.getImgFive()};for(int i = 0 ; i<imgs.length ; i++){Glide.with(context).load(imgUilList.get(i)).into(imgs[i]);}return;}return;}else if(getItemViewType(position) == TYPE_HEADER){//一般不建议在适配器里处理头和脚视图 直接在传递之前进行处理return;}else {return;}

getItemCount()方法根据不同的返回设置相对应的条目数

这个就不写注释了

    @Overridepublic int getItemCount() {if(mHeaderView == null && mFooterView == null){return message.size();}else if(mHeaderView == null && mFooterView != null){return message.size() + 1;}else if (mHeaderView != null && mFooterView == null){return message.size() + 1;}else {return message.size() + 2;}}

在Activity或Fragment中设置加载的头和脚

    private void initAdapter(List<FloorBean.DataBean> message) {recyclerView = fragmentView.findViewById(R.id.rec_floor);floorAdapter = new FloorAdapter();floorAdapter.setContext(getContext());floorAdapter.setMessage(message);//设置对应的头脚floorAdapter.setmHeaderView(setHeaderView());View foot = LayoutInflater.from(getContext()).inflate(R.layout.test_ll, null, false);floorAdapter.setmFooterView(foot);LinearLayoutManager layoutManager = new LinearLayoutManager(getContext());recyclerView.setLayoutManager(layoutManager);recyclerView.setAdapter(floorAdapter);}private View setHeaderView() {View header = LayoutInflater.from(getContext()).inflate(R.layout.header_front, null, false);mXBanner = header.findViewById(R.id.xbanner);mImgClassification = header.findViewById(R.id.img_classification);mImgSpike = header.findViewById(R.id.img_spike);mImgShopping = header.findViewById(R.id.img_shopping);mImgBaby = header.findViewById(R.id.img_baby);layoutHeader = header.findViewById(R.id.header_front);DisplayMetrics dm = getResources().getDisplayMetrics();int height = dm.heightPixels;LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) layoutHeader.getLayoutParams();params.height = (int) (height / 2.2);layoutHeader.setLayoutParams(params);return header;}

适配器完整代码

为什么会纠结不加载头和脚会出现数组越界异常呢?你既然费这么大力写了那么多 不就是为了加个头和脚吗?

package com.qingsu.ugrowshopping.vm.daapter;import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;import com.bumptech.glide.Glide;
import com.qingsu.ugrowshopping.R;
import com.qingsu.ugrowshopping.vm.bean.BannerBean;
import com.qingsu.ugrowshopping.vm.bean.FloorBean;import java.util.ArrayList;
import java.util.List;public class FloorAdapter extends  RecyclerView.Adapter<FloorAdapter.ViewHolder>{public static final int TYPE_NORMAL = 0; //说明是不带有header和footer的public static final int TYPE_HEADER = 1; //说明是带有Header的public static final int TYPE_FOOTER = 2; //说明是带有Footer的private List<FloorBean.DataBean> message;private Context context;//传入视图private View mHeaderView;private View mFooterView;public View getmHeaderView() {return mHeaderView;}public void setmHeaderView(View mHeaderView) {this.mHeaderView = mHeaderView;notifyItemInserted(0);}public View getmFooterView() {return mFooterView;}public void setmFooterView(View mFooterView) {this.mFooterView = mFooterView;notifyItemInserted(getItemCount()-1);}@Override//定义常量 判断RecyclerView具体的加载方式public int getItemViewType(int position) {//如果都不存在 返回的视图类型为常规适配器 正常就可 不需要特殊加载if(mHeaderView == null && mFooterView == null){return TYPE_NORMAL;}//设置不同View视图的位置 (有头时)且是在第一个条目时 返回对应的布局if(mHeaderView != null && position == 0){return TYPE_HEADER;}//设置不同View视图的位置 (有脚时)且在最后一个条目时 返回对应的布局if(mFooterView != null && position == getItemCount() - 1){return TYPE_FOOTER;}return TYPE_NORMAL;}public void setMessage(List<FloorBean.DataBean> message) {this.message = message;}public void setContext(Context context) {this.context = context;}public class ViewHolder extends RecyclerView.ViewHolder{private final ImageView imgTitle,imgOne,imgTwo,imgThree,imgFour,imgFive;public ViewHolder(@NonNull View itemView) {super(itemView);imgTitle = itemView.findViewById(R.id.img_title);imgOne = itemView.findViewById(R.id.img_commodityone);imgTwo = itemView.findViewById(R.id.img_commoditytwo);imgThree = itemView.findViewById(R.id.img_commoditythree);imgFour = itemView.findViewById(R.id.img_commodityfour);imgFive = itemView.findViewById(R.id.img_commodityfive);}public ImageView getImgTitle() {return imgTitle;}public ImageView getImgOne() {return imgOne;}public ImageView getImgTwo() {return imgTwo;}public ImageView getImgThree() {return imgThree;}public ImageView getImgFour() {return imgFour;}public ImageView getImgFive() {return imgFive;}}@NonNull@Overridepublic ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {//if(mHeaderView != null && viewType == TYPE_HEADER){return new ViewHolder(mHeaderView);}if (mFooterView != null && viewType == TYPE_FOOTER){return new ViewHolder(mFooterView);}View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_floor,parent,false);return new ViewHolder(view);}@Overridepublic void onBindViewHolder(@NonNull ViewHolder holder, int position) {//正常方式处理if(getItemViewType(position) == TYPE_NORMAL){//判断类型是否相匹配if(holder instanceof ViewHolder){//注意此时第0个条目已经被占据 因此要从position-1 来加载集合数据FloorBean.DataBean dataBean = message.get(position-1);Glide.with(context).load(dataBean.getFloor_title().getImage_src()).into(holder.getImgTitle());List<FloorBean.DataBean.Commodity> product_list = dataBean.getProduct_list();ArrayList<String> imgUilList = new ArrayList<>();for(FloorBean.DataBean.Commodity commodity : product_list){imgUilList.add(commodity.getImage_src());}ImageView[] imgs  = {holder.getImgOne(),holder.getImgTwo(),holder.getImgThree(),holder.getImgFour(),holder.getImgFive()};for(int i = 0 ; i<imgs.length ; i++){Glide.with(context).load(imgUilList.get(i)).into(imgs[i]);}return;}return;}else if(getItemViewType(position) == TYPE_HEADER){//一般不建议在适配器里处理头和脚视图 直接在传递之前进行处理return;}else {return;}}@Overridepublic int getItemCount() {if(mHeaderView == null && mFooterView == null){return message.size();}else if(mHeaderView == null && mFooterView != null){return message.size() + 1;}else if (mHeaderView != null && mFooterView == null){return message.size() + 1;}else {return message.size() + 2;}}}

效果

时尚女装上面的是个头
下面的一张图片是个脚

Android设置RecyclerView的Header和Footer相关推荐

  1. RecyclerView添加header与footer

    前言 这次主要关于RecyclerView添加header和footer的实现方法,我们都知道,在使用ListView的时候我们能自由的给自己的ListView添加头部与尾部.使用addHeaderV ...

  2. Android ListView自定义分割线 header 和footer设置没有页眉和页脚

    ListView.setFooterDividersEnabled(false);//设置listview无页脚 ListView.setHeaderDividersEnabled(false);// ...

  3. 实现带header和footer功能的RecyclerView

    这个项目很简单,其实一年前就开发完成了,但是一直没闲下来去整理. RecyclerView是Android 5.0版本引入的一个新的组件,目的是在一些场景中取代之前ListView和GridView, ...

  4. Android listView 去掉header和footer中的分割线

    Android listView 去掉header和footer中的分割线 方法一: 在listView中加上android:headerDividersEnabled="false&quo ...

  5. Android RecyclerView添加Header头部

     Android RecyclerView添加Header头部 Android RecyclerView不像以前的ListView那样直接添加头部,如果要给RecyclerView增加头部,则需要 ...

  6. Android中设置RecyclerView的每一个item的单项点击事件

    场景 Android中使用Adapter(适配器)给RecycleView设置数据源: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/detail ...

  7. 实现带header和footer功能的RecyclerView——完善篇

    在上一篇文章中我们实现了实现带header和footer功能的RecyclerView,见  实现带header和footer功能的RecyclerView 但是由于加入了header,item的po ...

  8. android recyclerview添加头部,Android RecyclerView添加Header头部

     Android RecyclerView添加Header头部 Android RecyclerView不像以前的ListView那样直接添加头部,如果要给RecyclerView增加头部,则需要 ...

  9. delphi xe6 android ListView增加 Header或Footer 的方法

    var   Item1: TListViewItem; begin     Item1 := ListView1.Items.Add;     Item1.Purpose:=TListItemPurp ...

  10. [Android]使用RecyclerView替代ListView(四:SeizeRecyclerView)

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/6641794.html [Android]使用RecyclerV ...

最新文章

  1. python获取节假日_用python获取表格中的节假日起始日期
  2. 偏移量详解-源自csna 菜鸟飞人
  3. 云原生落地难的五个痛点与解决方法
  4. hdu 3613 扩展kmp+回文串
  5. Django 02 url路由配置及渲染方式
  6. 设计模式----工厂模式
  7. PRML-系列一之1.2.5~1.2.6
  8. SpringBoot高级篇JdbcTemplate之数据查询上篇
  9. Bug管理 Mantis(配置详细)
  10. windows系统bat批处 注册一个exe执行文件变成服务
  11. c++内存中字节对齐问题详解 【转载】
  12. 【预测模型】基于狼群算法优化BP神经网络实现预测matlab源码
  13. PHP获取域名及域名IP的方法
  14. 计算机二级基础知识题库贴吧,考计算机二级用未来教育的题库会出原题吗
  15. 微信群总是有人发广告?看我用Python写一个自动化机器人消灭他!
  16. Win10下安装centos7双系统
  17. Magento后台添加商品(Simple Product和Configurable Product)
  18. Python 错误重试库 tenacity retry
  19. Original error: Error executing adbExec
  20. Could not autowire. No beans of 'StudentService' type found

热门文章

  1. openstack删除僵尸卷
  2. 2016年408计网选择题
  3. 【知识笔记】Debugging
  4. C语言项目-后宫选妃系统-第二天
  5. 学生管理系统IPO图_高校学生考勤管理系统
  6. html闪星星特效,jquery和canvas炫酷星星闪烁特效插件
  7. Log Parser 2.2 + Log Parser Lizard GUI 分析IIS日志示例
  8. 融资租赁、直租回租傻傻分不清楚
  9. Gearman中文手册技术文档分享chm
  10. Android 兼容Android 7拍摄照片/打开相册/选择照片/剪裁照片/显示照片 带demo