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. 【LeetCode 38_字符串_算术运算】Count and Say

    string countAndSay(int n) { string res; ) return res; res = "; ) { int len = res.size(); int i, ...

  2. Alpha冲刺一(7/10)

    前言 队名:拖鞋旅游队 组长博客:https://www.cnblogs.com/Sulumer/p/10013652.html 作业博客:https://edu.cnblogs.com/campus ...

  3. JSON.js 源码学习..

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. Python 使用Microsoft SQL Server数据库

    软件环境: Windows 7 32bit Python 3.6  Download https://www.python.org/downloads/ 默认安装,并添加环境变量,一路Next ... ...

  5. [Luogu4609][FJOI2016]建筑师

    luogu description 一个\(1...n\)的排列,其前缀最大值有\(A\)个,后缀最大值有\(B\)个,求满足要求的排列数. 一个位置\(i\)满足前缀最大当且仅当不存在\(j< ...

  6. [TopCoder11557]MatrixPower

    vjudge description 你有一个\(n \times n\)的矩阵\(A\),下标从\(0\)开始,其中\(A_{i,j}=di + q^j\). 给你\(d,q,n,k,s,t\),求 ...

  7. 阻塞和非阻塞I/O

    阻塞和非阻塞I/O是设备访问的两种不同模式,驱动程序可以灵活的支持用户空间对设备的这两种访问形式.        阻塞操作是指在执行设备操作时,若不能获得资源,则挂起进程直到满足可操作的条件后在进行操 ...

  8. A-B Problem nyoj

    A-B Problem 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 A+B问题早已经被大家所熟知了,是不是很无聊呢?现在大家来做一下A-B吧. 现在有两个实数A和 ...

  9. python 简明教程

    第一个源程序 #!/usr/bin/python# Filename : helloworld.pyprint 'Hello world' 执行: $ python helloworld.py 或者  ...

  10. MVC confirm提示

    //审核不同意 $("#shbtg").click(function () { $.messager.confirm("提示", "不通过则会被删除, ...