RecycleView想必大家都不陌生,它已他的高拓展性取代了传统布局显示,同时配合协调布局,可以实现很多意想不到的酷炫交互,今天就和大家介绍一下,如何给RecycleView添加头布局和尾布局,同时你也可以通过自己的拓展实现更多复杂的布局。

首先我们先看一下效果:

实现头部尾部布局其实方法还是很多,这里我推荐使用Adapter设置itemType来做,那么问题来了,为什么这么做呢?因为拓展性更强,并且更加解耦。将逻辑都写在adapter中,比起写在activity中管理起来也更加方便。

首先,我们需要明确一点,什么是head,什么是foot,当位于第一个item的时候就是head,最后一个就是foot.之后我们根据不同的itemType加载出来就可以了。

第一步判断头尾部以及内容区域:

private int getBodySize() {
return listData.size();
}
private boolean isHead(int position) {
return headCount!=&&position<headCount;
}
private boolean isFoot(int position) {
return footCount!=&&(position>=(getBodySize()+headCount));
}
public int getItemViewType(int position) {
if (isHead(position)) {
return HEAD_TYPE;
}else if (isFoot(position)) {
return FOOT_TYPE;
}else {
return BODY_TYPE;
}
}

根据不同的ViewType生产不同的Holder

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
switch (viewType) {
case HEAD_TYPE:
return new HeadViewHolder(mLayoutInflater.inflate(R.layout.trend_head,parent,false));
case BODY_TYPE:
return new BodyViewHolder(mLayoutInflater.inflate(R.layout.itemview_trend,parent,false));
case FOOT_TYPE:
return new FootViewHolder(mLayoutInflater.inflate(R.layout.trend_bottom,parent,false));
default:
return null;
} }

拿到不同的holder生产具体实现:

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if (holder instanceof HeadViewHolder) { }else if (holder instanceof BodyViewHolder) {
((BodyViewHolder) holder).body.setText((CharSequence) listData.get(position-headCount)); }else if (holder instanceof FootViewHolder) { } }

怎么样是不是很简单?其实还可以拓展实现更多样式的item只需要我们设置itemtype和位置就可以了。最后附上完整代码。

public class HBRecycleViewAdapter<T> extends RecyclerView.Adapter<RecyclerView.ViewHolder>{
private static final int HEAD_TYPE=;
private static final int BODY_TYPE=;
private static final int FOOT_TYPE=;
private int headCount=;//头部个数,后续可以自己拓展
private int footCount=;//尾部个数,后续可以自己拓展
private LayoutInflater mLayoutInflater;
private List<T>listData=new ArrayList<>();
public HBRecycleViewAdapter(Context context,List<T>listData) {
//this.context=context;
mLayoutInflater=LayoutInflater.from(context);
this.listData=listData;
}
private int getBodySize() {
return listData.size();
}
private boolean isHead(int position) {
return headCount!=&&position<headCount;
}
private boolean isFoot(int position) {
return footCount!=&&(position>=(getBodySize()+headCount));
}
@Override
public int getItemViewType(int position) {
if (isHead(position)) {
return HEAD_TYPE;
}else if (isFoot(position)) {
return FOOT_TYPE;
}else {
return BODY_TYPE;
}
} @Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
switch (viewType) {
case HEAD_TYPE:
return new HeadViewHolder(mLayoutInflater.inflate(R.layout.trend_head,parent,false));
case BODY_TYPE:
return new BodyViewHolder(mLayoutInflater.inflate(R.layout.itemview_trend,parent,false));
case FOOT_TYPE:
return new FootViewHolder(mLayoutInflater.inflate(R.layout.trend_bottom,parent,false));
default:
return null;
} } @Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if (holder instanceof HeadViewHolder) { }else if (holder instanceof BodyViewHolder) {
((BodyViewHolder) holder).body.setText((CharSequence) listData.get(position-headCount)); }else if (holder instanceof FootViewHolder) { } } @Override
public int getItemCount() {
return headCount+getBodySize()+footCount;
}
private static class HeadViewHolder extends RecyclerView.ViewHolder{ public HeadViewHolder(View itemView) {
super(itemView);
}
}
private static class BodyViewHolder extends RecyclerView.ViewHolder{
TextView body;
public BodyViewHolder(View itemView) {
super(itemView);
body= (TextView) itemView.findViewById(R.id.tv_body);
}
}
private static class FootViewHolder extends RecyclerView.ViewHolder { public FootViewHolder(View itemView) {
super(itemView);
}
}
}

手把手教你给RecycleView添加头布局和尾布局的更多相关文章

  1. Recyclerview添加头布局和尾布局,点击效果

    简介: 本篇博客主要包括recyclerview添加多种布局以及添加头布局和尾布局,还有item点击事件 思路: 主要重写Recyclerview.Adapter中的一些方法 1.public int ...

  2. 仿喜马拉雅实现ListView添加头布局和脚布局

     ListView添加头布局和脚布局 之前学习喜马拉雅的时候做的一个小Demo,贴出来,供大家学习参考: 如果我们当前的页面有多个接口.多种布局的话,我们一般的选择无非就是1.多布局:2.各种复杂滑动 ...

  3. 手把手教你开发Chrome扩展二:为html添加行为

    手把手教你开发chrome扩展一:开发Chrome Extenstion其实很简单 手把手教你开发Chrome扩展二:为html添加行为 手把手教你开发Chrome扩展三:关于本地存储数据 上一节我们 ...

  4. GridView不能添加头布局,并且scrollView与GridView冲突导致一些页面无法融合

    此贴为标记贴 方便下次使用 在项目需求中原本是用ScrollView来进行整个页面的滑动,ScrollView里面包含的有图片轮播,文字轮播,与2列GridView的item 问题 使用原生的Grid ...

  5. 手把手教从零开始在GitHub上使用Hexo搭建博客教程(二)-Hexo参数设置

    前言 前文手把手教从零开始在GitHub上使用Hexo搭建博客教程(一)-附GitHub注册及配置介绍了github注册.git相关设置以及hexo基本操作. 本文主要介绍一下hexo的常用参数设置. ...

  6. 【转】手把手教你把Vim改装成一个IDE编程环境(图文)

    手把手教你把Vim改装成一个IDE编程环境(图文) By: 吴垠 Date: 2007-09-07 Version: 0.5 Email: lazy.fox.wu#gmail.com Homepage ...

  7. 手把手教你修改iOS版QQ的运动步数

    手把手教你修改iOS版QQ的运动步数 现在很多软件都加上了运动模块,比如QQ和微信,而且还有排行榜,可以和好友比较谁的运动步数多,任何东西只要添加了比较功能,就变得不一样了.今天教大家用代码去修改QQ ...

  8. 手把手教你认识并搭建Nginx

    手把手教你认识并搭建Nginx Nginx (“engine x”) 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器. Nginx 是由 Igor ...

  9. iOS 非ARC基本内存管理系列 -手把手教你ARC——iOS/Mac开发ARC入门和使用(转)

    手把手教你ARC——iOS/Mac开发ARC入门和使用 Revolution of Objective-c 本文部分实例取自iOS 5 Toturail一书中关于ARC的教程和公开内容,仅用于技术交流 ...

随机推荐

  1. 升级安装windows8.1以后windowsphone8不能启动虚拟机的办法

    如果之前在的虚拟机是OK的话,VS2012需要安装update3补丁才可以. 下载地址:http://download.microsoft.com/download/D/4/8/D48D1AC2-A2 ...

  2. avalon 搭配 百度的UI移动框架 gmu 可以很好干活

    使用过的人评价, 这个UI稳定, bug少, 组件丰富, 触屏好; 小公司, 可以用用 链接

  3. C# 调用C++ DLL 的类型转换(转载版)

    最近在做视频监控相关的demo开发,实现语言是C#,但视频监控的SDK是C++开发的,所以涉及到C#调用C++的dll库.很多结构体.参数在使用时都要先进行转换,由非托管类型转换成托管类型后才能使用. ...

  4. ssh命令的使用

    ssh命令是用来远程登录服务器的,默认端口号为22. 常用的命令是: ssh   用户名@服务器地址 然后回车,输入登录服务器的密码 登录服务器后要进行上传下载文件,可以用scp命令,命令格式为: s ...

  5. Spring Boot 的项目打包成的 JAR 包,制作成 docker 镜像并运行

    上一篇:Docker学习(三)docker容器操作 首先把本地的项目打包好,我这里直接把已经打包好的springboot-mybatis-0.0.1-SNAPSHOT.jar包直接上传到linuxmy ...

  6. pandas groupby 使用

    so useful~ refer to: http://kekefund.com/2016/06/17/pandas-groupby/

  7. Web开发需要常见的问题

    1.sendRedirec()方法执行后,是会直接跳转到目标页面还是执行完其后的语句再跳转到目标页面??? 该方法在执行完其后面的语句才会跳转到目标页面,比如: public void doGet(H ...

  8. 【转】Windows消息投递流程:一般窗口消息投递(WM_LBUTTONCLICK)

    原文网址:http://blog.csdn.net/hyhnoproblem/article/details/6182646 本例通过在单文档程序的视图中添加WM_LBUTTONCLICK消息处理函数 ...

  9. Autocad 2010+ObjectArx 2010 +Vs2010 的.net 开发设置(转)

    Autocad 2010+ObjectArx 2010 +Vs2010 的.net 开发设置 分类: ObjectArx.net2010-09-14 16:52 4203人阅读 评论(7) 收藏 举报 ...

  10. nginix.conf 中的gzip模块设置

    gizp模块配置 gzip  on;    gzip_min_length  1k;    gzip_buffers     4 16k;    gzip_http_version 1.0;    g ...