2019独角兽企业重金招聘Python工程师标准>>>

在之前学习ListView的时候,有学习过如何给ListView添加列表头和列表尾。但是通过近几期的学习,发现RecyclerView是一个比ListView更加强大和灵活的组件,今天一起来学习如何给RecyclerView添加首尾视图。

首先来简单回顾一下ListView是如何添加列表头和列表尾的,先定义好首尾视图,然后通过addHeaderView和addFooterView两个方法来加载即可,相对来说比较简单。然后在RecyclerView中并未发现类似的方法,那么应该如何为其添加首尾视图呢?

可能一些细心的同学已经发了RecyclerView.Adapter中还有几个方法没有被重写过,就先来看看是哪几个方法:

  • getItemViewType:判断当前item类型。

  • isHeaderView:判断当前item是否是HeadView。

  • isBottomView:判断当前item是否是FooterView。

同时可以看到在onCreateViewHolder方法里面带一个viewType参数,实际上onCreateViewHolder方法就是根据viewType来判断具体item是列表项、HeaderView或FooterView,然后来分别加载不同的布局文件。

接下来继续使用再上一期的案例来学习如何给RecyclerView添加首尾视图。

在main/res/layout/目录下创建recyclerview_header.xml文件,在其中填充如下代码片段:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="50dp"><TextViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:text="Header View"android:textSize="20sp"android:gravity="center"/>
</LinearLayout>

继续新建一个recyclerview_footer.xml文件,在其中填充如下代码片段:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="50dp"><TextViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:text="Footer View"android:textSize="20sp"android:gravity="center"/>
</LinearLayout>

然后修改RecyclerViewAdapter文件,在getItemViewType方法里面判断了当前Item的类型,然后在onCreateViewHolder跟据item的类型分别加载不同的布局以实现HeaderView和FooterView。修改后的RecyclerViewAdapter代码如下:

package com.jinyu.cqkxzsxy.android.advancedviewsample.adapter;import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;import com.jinyu.cqkxzsxy.android.advancedviewsample.R;import java.util.ArrayList;/*** @创建者 鑫鱻* @描述 Android零基础入门到精通系列教程* 首发微信公众号分享达人秀(ShareExpert)*/
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {//item类型public static final int ITEM_TYPE_HEADER = 0;public static final int ITEM_TYPE_CONTENT = 1;public static final int ITEM_TYPE_BOTTOM = 2;private ArrayList<String> mDatas = null;private LayoutInflater mInflater = null;private OnItemClickListener mOnItemClickListener = null;private OnItemLongClickListener mOnItemLongClickListener = null;public RecyclerViewAdapter(Context context, ArrayList<String> datas) {this.mDatas = datas;this.mInflater = LayoutInflater.from(context);}//内容长度public int getContentItemCount(){return mDatas == null ? 0 : mDatas.size();}//判断当前item是否是HeadViewpublic boolean isHeaderView(int position) {return 0 == position;}//判断当前item是否是FooterViewpublic boolean isBottomView(int position) {return position == (getContentItemCount() + 1);}//判断当前item类型@Overridepublic int getItemViewType(int position) {if (0 == position) {//头部Viewreturn ITEM_TYPE_HEADER;} else if (getContentItemCount() + 1 == position) {//底部Viewreturn ITEM_TYPE_BOTTOM;} else {//内容Viewreturn ITEM_TYPE_CONTENT;}}// 创建新View,被LayoutManager所调用@Overridepublic RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {RecyclerView.ViewHolder vewHolder = null;View view = null;if(ITEM_TYPE_HEADER == viewType) {view = mInflater.inflate(R.layout.recyclerview_header, parent, false);vewHolder = new HeaderViewHolder(view);} else if(ITEM_TYPE_BOTTOM == viewType) {view = mInflater.inflate(R.layout.recyclerview_footer, parent, false);vewHolder = new FooterViewHolder(view);} else {view = mInflater.inflate(R.layout.recyclerview_item, parent, false);vewHolder = new ViewHolder(view);}return vewHolder;}// 将数据与界面进行绑定的操作@Overridepublic void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {if(holder instanceof HeaderViewHolder) {} else if(holder instanceof FooterViewHolder){}else {final ViewHolder viewHolder = (ViewHolder) holder;String name = mDatas.get(position - 1);viewHolder.titleTv.setText("Title " + name);viewHolder.contenTv.setText("content " + name);// 点击事件注册及分发if (null != mOnItemClickListener) {viewHolder.titleTv.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {mOnItemClickListener.onClick(viewHolder.titleTv, position);}});viewHolder.contenTv.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {mOnItemClickListener.onClick(viewHolder.contenTv, position);}});}// 长按事件注册及分发if (null != mOnItemLongClickListener) {viewHolder.titleTv.setOnLongClickListener(new View.OnLongClickListener() {@Overridepublic boolean onLongClick(View v) {return mOnItemLongClickListener.onLongClick(viewHolder.titleTv, position);}});viewHolder.contenTv.setOnLongClickListener(new View.OnLongClickListener() {@Overridepublic boolean onLongClick(View v) {return mOnItemLongClickListener.onLongClick(viewHolder.contenTv, position);}});}}}// 获取数据的数量@Overridepublic int getItemCount() {return getContentItemCount() + 2;}// 设置点击事件public void setOnItemClickListener(OnItemClickListener l) {this.mOnItemClickListener = l;}// 设置长按事件public void setOnItemLongClickListener(OnItemLongClickListener l) {this.mOnItemLongClickListener = l;}// 在对应位置增加一个itempublic void addData(int position) {mDatas.add(position, "Insert " + position);notifyItemInserted(position);if(position != getItemCount()) {notifyItemRangeChanged(position, getItemCount());}}// 删除对应itempublic void removeData(int position) {mDatas.remove(position);notifyItemRemoved(position);if(position != getItemCount()) {notifyItemRangeChanged(position, getItemCount());}}// 点击事件接口public interface OnItemClickListener {void onClick(View parent, int position);}// 长按事件接口public interface OnItemLongClickListener {boolean onLongClick(View parent, int position);}// 自定义的ViewHolder,持有每个Item的的所有界面组件public class ViewHolder extends RecyclerView.ViewHolder {public TextView titleTv = null;public TextView contenTv = null;public ViewHolder(View itemView) {super(itemView);titleTv = (TextView) itemView.findViewById(R.id.title_tv);contenTv = (TextView) itemView.findViewById(R.id.content_tv);}}//头部 ViewHolderpublic class HeaderViewHolder extends RecyclerView.ViewHolder {public HeaderViewHolder(View itemView) {super(itemView);}}//底部 ViewHolderpublic class FooterViewHolder extends RecyclerView.ViewHolder {public FooterViewHolder(View itemView) {super(itemView);}}
}

然后其他代码不变,重新运行程序,可以看到下图所示界面效果。

至此,关于RecyclerView的首尾视图添加已经学习完毕。当然这里只是简单介绍了其中一种实现方式,更多实现方式后期逐渐学习,欢迎一起交流讨论。

今天就先到这里,如果有问题欢迎留言一起探讨,也欢迎加入Android零基础入门技术讨论微信群,共同成长!

此文章版权为微信公众号分享达人秀(ShareExpert)——鑫鱻所有,若需转载请联系作者授权,特此声明!

往期总结分享:

Android零基础入门第1节:Android的前世今生

Android零基础入门第2节:Android 系统架构和应用组件那些事

Android零基础入门第3节:带你一起来聊一聊Android开发环境

Android零基础入门第4节:正确安装和配置JDK, 高富帅养成第一招

Android零基础入门第5节:善用ADT Bundle, 轻松邂逅女神

Android零基础入门第6节:配置优化SDK Manager, 正式约会女神

Android零基础入门第7节:搞定Android模拟器,开启甜蜜之旅

Android零基础入门第8节:HelloWorld,我的第一趟旅程出发点

Android零基础入门第9节:Android应用实战,不懂代码也可以开发

Android零基础入门第10节:开发IDE大升级,终于迎来了Android Studio

Android零基础入门第11节:简单几步带你飞,运行Android Studio工程

Android零基础入门第12节:熟悉Android Studio界面,开始装逼卖萌

Android零基础入门第13节:Android Studio个性化配置,打造开发利器

Android零基础入门第14节:使用高速Genymotion,跨入火箭时代

Android零基础入门第15节:掌握Android Studio项目结构,扬帆起航

Android零基础入门第16节:Android用户界面开发概述

Android零基础入门第17节:文本框TextView

Android零基础入门第18节:输入框EditText

Android零基础入门第19节:按钮Button

Android零基础入门第20节:复选框CheckBox和单选按钮RadioButton

Android零基础入门第21节:开关组件ToggleButton和Switch

Android零基础入门第22节:图像视图ImageView

Android零基础入门第23节:图像按钮ImageButton和缩放按钮ZoomButton

Android零基础入门第24节:自定义View简单使用,打造属于你的控件

Android零基础入门第25节:简单且最常用的LinearLayout线性布局

Android零基础入门第26节:两种对齐方式,layout_gravity和gravity大不同

Android零基础入门第27节:正确使用padding和margin

Android零基础入门第28节:轻松掌握RelativeLayout相对布局

Android零基础入门第29节:善用TableLayout表格布局

Android零基础入门第30节:两分钟掌握FrameLayout帧布局

Android零基础入门第31节:少用的AbsoluteLayout绝对布局

Android零基础入门第32节:新推出的GridLayout网格布局

Android零基础入门第33节:Android事件处理概述

Android零基础入门第34节:Android中基于监听的事件处理

Android零基础入门第35节:Android中基于回调的事件处理

Android零基础入门第36节:Android系统事件的处理

Android零基础入门第37节:初识ListView

Android零基础入门第38节:初识Adapter

Android零基础入门第39节:ListActivity和自定义列表项

Android零基础入门第40节:自定义ArrayAdapter

Android零基础入门第41节:使用SimpleAdapter

Android零基础入门第42节:自定义BaseAdapter

Android零基础入门第43节:ListView优化和列表首尾使用

Android零基础入门第44节:ListView数据动态更新

Android零基础入门第45节:网格视图GridView

Android零基础入门第46节:列表选项框Spinner

Android零基础入门第47节:自动完成文本框AutoCompleteTextView

Android零基础入门第48节:可折叠列表ExpandableListView

Android零基础入门第49节:AdapterViewFlipper图片轮播

Android零基础入门第50节:StackView卡片堆叠

Android零基础入门第51节:进度条ProgressBar

Android零基础入门第52节:自定义ProgressBar炫酷进度条

Android零基础入门第53节:拖动条SeekBar和星级评分条RatingBar

Android零基础入门第54节:视图切换组件ViewSwitcher

Android零基础入门第55节:ImageSwitcher和TextSwitcher

Android零基础入门第56节:翻转视图ViewFlipper

Android零基础入门第57节:DatePicker和TimePicker选择器

Android零基础入门第58节:数值选择器NumberPicker

Android零基础入门第59节:常用三大Clock时钟组件

Android零基础入门第60节:日历视图CalendarView和定时器Chronometer

Android零基础入门第61节:滚动视图ScrollView

Android零基础入门第62节:搜索框组件SearchView

Android零基础入门第63节:值得借鉴学习的选项卡TabHost

Android零基础入门第64节:揭开RecyclerView庐山真面目

Android零基础入门第65节:RecyclerView分割线开发技巧

Android零基础入门第66节:RecyclerView点击事件处理

Android零基础入门第67节:RecyclerView数据动态更新

转载于:https://my.oschina.net/u/3598984/blog/1543416

Android零基础入门第68节:完善RecyclerView,添加首尾视图相关推荐

  1. Android零基础入门第87节:Fragment添加、删除、替换

    2019独角兽企业重金招聘Python工程师标准>>> 前面一起学习了Fragment的创建和加载,以及其生命周期方法,那么接下来进一步来学习Fragment的具体使用,本期先来学习 ...

  2. Android零基础入门第65节:RecyclerView分割线开发技巧

    2019独角兽企业重金招聘Python工程师标准>>> 在上一期通过简单学习,已经领略到了RecyclerView的灵活性,当然都是一些最基础的用法,那么本期一起来学习Recycle ...

  3. Android零基础入门第77节:Activity任务栈和启动模式

    2019独角兽企业重金招聘Python工程师标准>>> 通过前面的学习,Activity的基本使用都已掌握,接下来一起来学习更高级的一些内容. Android采用任务栈(Task)的 ...

  4. Android零基础入门第89节:Fragment回退栈及弹出方法

    2019独角兽企业重金招聘Python工程师标准>>> 在上一期分享的文章末尾留了一个课后作业,有去思考如何解决吗?如果已经会了那么恭喜你,如果还不会也没关系,本期一起来学习. 一. ...

  5. Android零基础入门第81节:Activity数据传递

    在Android开发中,经常要在Activity之间传递数据.前面也学习了Activity和Intent相关基础,接下来一起来学习Activity的数据传递. 一.简介 通过前面的学习知道,Inten ...

  6. Android零基础入门第83节:Activity间数据传递方法汇总

    2019独角兽企业重金招聘Python工程师标准>>> 在Activity间传递的数据一般比较简单,但是有时候实际开发中也会传一些比较复杂的数据,本节一起来学习更多Activity间 ...

  7. Android零基础入门第85节:Fragment使用起来非常简单

    2019独角兽企业重金招聘Python工程师标准>>> Fragment创建完成后并不能单独使用,还需要将Fragment加载到Activity中,在Activity中添加Fragm ...

  8. Android零基础入门第86节:探究Fragment生命周期

    2019独角兽企业重金招聘Python工程师标准>>> 一个Activity可以同时组合多个Fragment,一个Fragment也可被多个Activity 复用.Fragment可 ...

  9. Android零基础入门第75节:Activity状态和生命周期方法

    前面两期我们学习了Activity的创建和注册.以及启动和关闭,也学会了重写onCraete方法,这些知识在实际开发中远远不够,还需要学习了解更多. 生命周期就是一个对象从创建到销毁的过程,每一个对象 ...

最新文章

  1. Qt for Android (Alpha) 发布
  2. 什么是.Net, IL, CLI, BCL, FCL, CTS, CLS, CLR, JIT
  3. 你会因为什么原因而离职
  4. js自动滚动条在底部
  5. 主流编程语言最好的编辑器,你的工具用对了吗?
  6. 斐讯n1安装armbian系统的方法
  7. 达梦单机搭建及简单使用
  8. dw新建html快捷键,DW软件新建一个html网页
  9. MATLAB-插值算法汇总
  10. 网络领域 ——《Adaptable Switch: A Heterogeneous Switch Architecture for Network-Centric Computing》
  11. docker logs 说明
  12. php写火车头采集接口,的这个火车头采集接口我在火车头采集规则里已经写了采集时间的规,迅睿CMS,CodeIgniter技术文档,PHP开发文档,迅睿CMS框架官方教程...
  13. 深入浅出Mysql - 优化篇(索引)
  14. 什么是BSP? 概念解析
  15. android 开发社区
  16. postgis转换简单geometry
  17. 帝国根目录查阅 帝国CMS根目录一览表 ECMC根目录都是什么意思?
  18. 易买网更多新闻代码_新闻 | 1022Bewhy结婚等更多资讯
  19. gevent学习介绍
  20. Proxmox VE安装、集群配置

热门文章

  1. vb中line的用法[转]
  2. 苹果公布了一些最新无人车进展,但,研发依然缓慢
  3. Ubuntu18.10与windows7文件夹共享
  4. c#学习笔记01——引用类
  5. android adb端口被占用问题
  6. Hello工作室制作《无人深空》更新档
  7. 初等数论中的欧拉公式
  8. 有没有能够很快上手的报表框架
  9. class.sitemap.php
  10. 当心异步刷新后的脚本文件加载