欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android RecyclerView添加FootView和HeadView

程序员文章站 2024-03-05 13:08:18
前提概要: 上一篇文章已经介绍过了recyclerview的基本使用方法,原文如下:android recyclerview布局真的只是那么简单!此篇文章算是对recyc...

前提概要:

上一篇文章已经介绍过了recyclerview的基本使用方法,原文如下:android recyclerview布局真的只是那么简单!此篇文章算是对recyclerview更深使用的介绍。

footview和headview在listview中的本身就有相对应的函数,但是在新潮的recyclerview中却没有了,footview在分页加载(上拉加载更多)中起着很重要的作用,因此也必须要学习一下了。(headview的添加与footview的添加相比大致一样,在此就只讲footview的添加了)

效果: (源码在文章结尾)

Android RecyclerView添加FootView和HeadView

实现关键

int getitemviewtype(int position):此函数是recyclerview中自带的函数,参数为每个item的position,返回一个int类型表示类型。

此函数的作用是区分普通的item与footview的item,让footview这个item能一直处在adapter中的最下端。

在例子中定义了两种类型如下:

 //两个final int类型表示viewtype的两种类型
 private final int normal_type = 0;
 private final int foot_type = 1111;


该函数如下:

 @override
 public int getitemviewtype(int position) {
 if (position == max_count - 1) {
 return foot_type;
 }
 return normal_type;
 }

实现步骤

1、定义getitemviewtype(int position)并且定义自己所需要的viewtype的类型。
2、在定义viewholder(),oncreateviewholder()和onbindviewholder()中都考虑两种情况,一种是普通的item,另一种是footview。
另外默认的viewholder()函数中只会有view itemview一个参数,此处因为需要,所以要添加int viewtype的参数,代码中如下:

//初始化viewholder,此处绑定后在onbindviewholder中可以直接使用
 public viewholder(view itemview, int viewtype) {
 super(itemview);
 if (viewtype == normal_type) {
 tvviewholder = (textview) itemview.findviewbyid(r.id.tv_view_holder);
 llviewholder = (linearlayout) itemview;
 } else if (viewtype == foot_type) {
 tvfootview = (textview) itemview;
 }
 }

此处再说一下三个函数的大致作用:

viewholder(view itemview, int viewtype):

将item布局中的控件与viewholder中所定义的属性绑定,更便于在onbindviewholder()中使用。

oncreateviewholder(viewgroup parent, int viewtype):

此函数用来创建每一个item,最后返回的不是view,而是返回的一个viewholder。

onbindviewholder(viewholder holder, int position):

此函数中一般用来将数据绑定到item中的控件中。

代码:

结合以上分析看代码,读者应该比较容易理解了,下面附上关键adapter代码和源码地址:

public class recycleradapter extends recyclerview.adapter<recycleradapter.viewholder> {
 private list<string> mdata;//数据
 private int max_count = 10;//最大显示数
 private boolean isfootview = false;//是否添加了footview
 private string footviewtext = "";//footview的内容

 //两个final int类型表示viewtype的两种类型
 private final int normal_type = 0;
 private final int foot_type = 1111;


 public recycleradapter(list<string> data) {
 mdata = data;
 }

 public class viewholder extends recyclerview.viewholder {
 public textview tvviewholder;
 public linearlayout llviewholder;

 public textview tvfootview;//footview的textview属于独自的一个layout

 //初始化viewholder,此处绑定后在onbindviewholder中可以直接使用
 public viewholder(view itemview, int viewtype) {
 super(itemview);
 if (viewtype == normal_type) {
 tvviewholder = (textview) itemview.findviewbyid(r.id.tv_view_holder);
 llviewholder = (linearlayout) itemview;
 } else if (viewtype == foot_type) {
 tvfootview = (textview) itemview;
 }
 }
 }

 @override
 public viewholder oncreateviewholder(viewgroup parent, int viewtype) {
 view normal_views = layoutinflater.from(parent.getcontext()).inflate(
 r.layout.rc_item, parent, false);
 view foot_view = layoutinflater.from(parent.getcontext()).inflate(
 r.layout.foot_view, parent, false);

 if (viewtype == foot_type)
 return new viewholder(foot_view, foot_type);
 return new viewholder(normal_views, normal_type);
 }

 @override
 public int getitemviewtype(int position) {
 if (position == max_count - 1) {
 return foot_type;
 }
 return normal_type;
 }

 @override
 public void onbindviewholder(viewholder holder, int position) {
 //建立起viewholder中试图与数据的关联
 log.d("xjj", getitemviewtype(position) + "");
 //如果footview存在,并且当前位置viewtype是foot_type
 if (isfootview && (getitemviewtype(position) == foot_type)) {
 holder.tvfootview.settext(footviewtext);
 } else {
 holder.tvviewholder.settext(mdata.get(position) + position);
 }
 }

 @override
 public int getitemcount() {
 if (mdata.size() < max_count) {
 return mdata.size();
 }
 return max_count;
 }

 //创建一个方法来设置footview中的文字
 public void setfootviewtext(string footviewtext) {
 isfootview = true;
 this.footviewtext = footviewtext;
 }
}

拓展延伸

下一篇文章中,笔者在此基础上做了一下一点改动,很容易就实现了分页加载的功能,文章地址如下:
http://blog.csdn.net/double2hao/article/details/52788708

源码地址:http://xiazai.jb51.net/201610/yuanma/androidpullrecyclerview(jb51.net).rar

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。