Android设置RecyclerView的Header和Footer
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相关推荐
- RecyclerView添加header与footer
前言 这次主要关于RecyclerView添加header和footer的实现方法,我们都知道,在使用ListView的时候我们能自由的给自己的ListView添加头部与尾部.使用addHeaderV ...
- Android ListView自定义分割线 header 和footer设置没有页眉和页脚
ListView.setFooterDividersEnabled(false);//设置listview无页脚 ListView.setHeaderDividersEnabled(false);// ...
- 实现带header和footer功能的RecyclerView
这个项目很简单,其实一年前就开发完成了,但是一直没闲下来去整理. RecyclerView是Android 5.0版本引入的一个新的组件,目的是在一些场景中取代之前ListView和GridView, ...
- Android listView 去掉header和footer中的分割线
Android listView 去掉header和footer中的分割线 方法一: 在listView中加上android:headerDividersEnabled="false&quo ...
- Android RecyclerView添加Header头部
Android RecyclerView添加Header头部 Android RecyclerView不像以前的ListView那样直接添加头部,如果要给RecyclerView增加头部,则需要 ...
- Android中设置RecyclerView的每一个item的单项点击事件
场景 Android中使用Adapter(适配器)给RecycleView设置数据源: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/detail ...
- 实现带header和footer功能的RecyclerView——完善篇
在上一篇文章中我们实现了实现带header和footer功能的RecyclerView,见 实现带header和footer功能的RecyclerView 但是由于加入了header,item的po ...
- android recyclerview添加头部,Android RecyclerView添加Header头部
Android RecyclerView添加Header头部 Android RecyclerView不像以前的ListView那样直接添加头部,如果要给RecyclerView增加头部,则需要 ...
- delphi xe6 android ListView增加 Header或Footer 的方法
var Item1: TListViewItem; begin Item1 := ListView1.Items.Add; Item1.Purpose:=TListItemPurp ...
- [Android]使用RecyclerView替代ListView(四:SeizeRecyclerView)
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/6641794.html [Android]使用RecyclerV ...
最新文章
- python获取节假日_用python获取表格中的节假日起始日期
- 偏移量详解-源自csna 菜鸟飞人
- 云原生落地难的五个痛点与解决方法
- hdu 3613 扩展kmp+回文串
- Django 02 url路由配置及渲染方式
- 设计模式----工厂模式
- PRML-系列一之1.2.5~1.2.6
- SpringBoot高级篇JdbcTemplate之数据查询上篇
- Bug管理 Mantis(配置详细)
- windows系统bat批处 注册一个exe执行文件变成服务
- c++内存中字节对齐问题详解 【转载】
- 【预测模型】基于狼群算法优化BP神经网络实现预测matlab源码
- PHP获取域名及域名IP的方法
- 计算机二级基础知识题库贴吧,考计算机二级用未来教育的题库会出原题吗
- 微信群总是有人发广告?看我用Python写一个自动化机器人消灭他!
- Win10下安装centos7双系统
- Magento后台添加商品(Simple Product和Configurable Product)
- Python 错误重试库 tenacity retry
- Original error: Error executing adbExec
- Could not autowire. No beans of 'StudentService' type found