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. Spring map注入

    类test.Configurations定义如下 @Getter @Setter public class Configurations { private Map<AnswerSourceTy ...

  2. PTA编程总

    7-1 币值转换 (20 分) 输入一个整数(位数不超过9位)代表一个人民币值(单位为元),请转换成财务要求的大写中文格式.如23108元,转换后变成“贰万叁仟壹百零捌”元.为了简化输出,用小写英文字 ...

  3. (转)类的sizeof

    来源:http://www.360doc.com/content/12/0315/17/3349869_194600377.shtml

  4. Documentation/kobject.txt翻译--sysfs

    你从未想过的关于kobjects,ksets和ktypes的一切:作者:Greg Kroah-Hartman <gregkh@linuxfoundation.org>:上次更新时间:200 ...

  5. C#在64位操作系统上连接Oracle的问题和解决方案

    C#使用System.Data.OracleClient连接Oracle数据库.之前在WinXP上正常运行的程序移植到Windows 2008 x64上之后就连不上数据库了.错误信息如下: 尝试加载O ...

  6. HR-人力资源管理系统(Human Resources Management System,HRMS)

    人力资源管理系统(Human Resources Management System,HRMS),是指组织或社会团体运用系统学理论方法,对企业的人力资源管理方方面面进行分析.规划.实施.调整,提高企业 ...

  7. Accessing data in Hadoop using dplyr and SQL

    If your primary objective is to query your data in Hadoop to browse, manipulate, and extract it into ...

  8. [转]JAVA 反射及使用

    <%@page contentType="text/html; charset=GBK"%> <%@page import="java.security ...

  9. servlet 3.0无需配置web.xml,使用注入方式配置servlet实现登陆功能(服务器需要支持servlet3.0)

    首先申明上面的报错红叉,我也不知道怎么回事.总之能运行. 新建项目时选择java EE6.0,低版本没有servlet3.0. 先看一个基本示例. Test.java是用来测试无需配置文件,无需静态页 ...

  10. 十二.jQuery源码解析之.eq().first().last().slice()

    eq(index):将集合中的索引为index的元素提取出来. first():返回集合中的第一个元素. .last():防护集合中的最后一个元素. .slice(start[,end]):返回集合中 ...