手把手教你给RecycleView添加头布局和尾布局
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添加头布局和尾布局的更多相关文章
- Recyclerview添加头布局和尾布局,点击效果
简介: 本篇博客主要包括recyclerview添加多种布局以及添加头布局和尾布局,还有item点击事件 思路: 主要重写Recyclerview.Adapter中的一些方法 1.public int ...
- 仿喜马拉雅实现ListView添加头布局和脚布局
ListView添加头布局和脚布局 之前学习喜马拉雅的时候做的一个小Demo,贴出来,供大家学习参考: 如果我们当前的页面有多个接口.多种布局的话,我们一般的选择无非就是1.多布局:2.各种复杂滑动 ...
- 手把手教你开发Chrome扩展二:为html添加行为
手把手教你开发chrome扩展一:开发Chrome Extenstion其实很简单 手把手教你开发Chrome扩展二:为html添加行为 手把手教你开发Chrome扩展三:关于本地存储数据 上一节我们 ...
- GridView不能添加头布局,并且scrollView与GridView冲突导致一些页面无法融合
此贴为标记贴 方便下次使用 在项目需求中原本是用ScrollView来进行整个页面的滑动,ScrollView里面包含的有图片轮播,文字轮播,与2列GridView的item 问题 使用原生的Grid ...
- 手把手教从零开始在GitHub上使用Hexo搭建博客教程(二)-Hexo参数设置
前言 前文手把手教从零开始在GitHub上使用Hexo搭建博客教程(一)-附GitHub注册及配置介绍了github注册.git相关设置以及hexo基本操作. 本文主要介绍一下hexo的常用参数设置. ...
- 【转】手把手教你把Vim改装成一个IDE编程环境(图文)
手把手教你把Vim改装成一个IDE编程环境(图文) By: 吴垠 Date: 2007-09-07 Version: 0.5 Email: lazy.fox.wu#gmail.com Homepage ...
- 手把手教你修改iOS版QQ的运动步数
手把手教你修改iOS版QQ的运动步数 现在很多软件都加上了运动模块,比如QQ和微信,而且还有排行榜,可以和好友比较谁的运动步数多,任何东西只要添加了比较功能,就变得不一样了.今天教大家用代码去修改QQ ...
- 手把手教你认识并搭建Nginx
手把手教你认识并搭建Nginx Nginx (“engine x”) 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器. Nginx 是由 Igor ...
- iOS 非ARC基本内存管理系列 -手把手教你ARC——iOS/Mac开发ARC入门和使用(转)
手把手教你ARC——iOS/Mac开发ARC入门和使用 Revolution of Objective-c 本文部分实例取自iOS 5 Toturail一书中关于ARC的教程和公开内容,仅用于技术交流 ...
随机推荐
- please complete all spokes before continuing 提示
解决方法:输入“1”,按Enter键输入“2”,按Enter键输入“q",按Enter键输入“yes”,按Enter键
- jquery3.1.1报错Uncaught TypeError: a.indexOf is not a function
jquery3.1.1报错Uncaught TypeError: a.indexOf is not a function 使用1.9就没有问题,解决办法: 就是把写的代码中: $(window).lo ...
- git 基础学习笔记
配置ssh 打开命令行或者git bash 输入 创建git库 git init 检查当前状态 $ git status On branch master nothing to commit, wor ...
- Winform开发常用控件之DataGridView的简单数据绑定——自动绑定
DataGridView控件可谓是Winform开发的重点控件,对于数据的呈现和操作非常方便,DataGridView可谓是既简单又复杂.简单在于其已经集成了很多方法,复杂在于可以使用其实现复杂的数据 ...
- 树的直径证明+HDU2196
首先把无向图变成一棵树,直径肯定由叶子组成. 有以下两种情况: 第一种:经过根节点,则找两个最远的叶子肯定是直径,也就是B+D. 第二种:不经过根节点,则目标的两个叶子肯定有一个不为根的公共祖先,如红 ...
- TCP建立连接的三次握手和TCP连接断开的四次挥手
1. TCP建立连接的3次握手 2. TCP断开连接的四次挥手 [注意]中断连接端可以是Client端,也可以是Server端. 图3—Client端主动发起关闭连接请求 1. 假设Client端主动 ...
- c++交叉#include问题
这个问题会引起莫名其妙的编译错误, 碰到类里有其他类的指针的话,不要#include,提前声明下即可 class_a.h #ifndef CLASS_A_H #define CLASS_A_H cla ...
- AngularJS开发指南14:依赖注入
推荐两种使用场景: 1.控制器中的依赖注入 控制器是负责应用行为的类.推荐的控制器声明方法如下: var MyController = function(dep1, dep2) { ... } MyC ...
- 使用SharpZip压缩与解压缩
使用SharpZip压缩与解压缩 编写人:左丘文 2015-4-11 大家在做项目时,相信会经常性的会遇到要对数据流或dataset byte[] 或文件进行压缩和解压缩,比如:利用webservic ...
- OpenSSL编写SSL,TLS程序***
一.简介 SSL(Secure Socket Layer)是netscape公司提出的主要用于web的安全通信标准,分为2.0版和3.0版.TLS(Transport Layer Security)是 ...