如何优雅的给recycleView增加下拉刷新和加载更多

recycleView作为一个新的控件,那是有其特点的。在日常的使用中,基本是可以代替listView和gridview使用的,同时,它还多了一种瀑布流的展示方式。

因此,个人是比较推荐开发者在项目开发过程中逐渐的使用recycview代替listview和gridview的。大家也都知道产品经理的想法永远是捉摸不定的,这次跟你说要垂直布局,好,等你用listview做完之后,就又跟你说觉得网格布局可能会好一点!!!ok,当你终于把控件转换成gridview,修改了大量的代码之后。如果,产品经理再跟你说,最后决定还是使用瀑布流得我样式好了, 你会不会有种崩溃的感觉。反正,我是会和PM打一架再说的。。。

总而言之,竟然最后还是得从了PM,何不一开始就已经做好准备呢?

RecyclView就是这样的一款新的控件。它把布局管理,item动画等都独立暴露了出来。虽然代码是增加了,但是却变得更加的灵活了,像上面的需求你只需要改动一行代码就可以实现了。

关于RecyView如何使用,网上已经有太多的教程了,因此我也不再讲解,大家可以参考下面这位大神的文章:

RecyclerView使用完全指南,是时候体验新控件了

这是一篇讲解的已经很详细的文章了,感谢作者的分享(还没有经过您的同意就放上你的文章,请见谅哈)

我这一片文章主要讲解的是如何优雅的增加下拉刷新和加载更多

关于下拉刷新

下拉刷新,在网上已经是有很多种的解决方案了,个人是比较喜欢通过在RecyView外层包裹一层 SwipeRefreshLayout来处理的。

SwipeRefreshLayout作为一个新的控件,使用简单,样式好看~

1.在xml中使用SwipeRefreshLayout包裹RecycleView


xml布局

2.绑定控件

refresh_layout= (SwipeRefreshLayout) rootView.findViewById(R.id.refresh_layout);

//添加刷新监听器

refresh_layout.setOnRefreshListener(newSwipeRefreshLayout.OnRefreshListener() {

  @Override

  public voidonRefresh() {

  //加载数据

  backURL();

}

});

3.在加载完数据之后,记得要在UI线程中调用

if(refresh_layout.isRefreshing()){

    refresh_layout.setRefreshing(false);

}

记住这个操作只能在UI线程中执行,而且要是忘记了这个操作,那么即使在加载完数据之后,加载动画也不会停下来的

关于SwipRefreshLayout的更多用法可以参考

Android开发之SwipeRefreshLayout实现下拉刷新

总体的用法还是非常的简单易用的。好啦,下拉刷新就是这么的简单。

这一次的重点来了:

实现加载更多

网上实现加载更多的方法有很多。

今天由于想把项目的体积降下来,要砍掉一些没有必要的库,然后我就看到之前为了省时间直接就依赖了一个项目来实现瀑布流,然后瀑布流的布局在整个项目中,其实就只用了一次,就因为只用一次的东西而增加了一个依赖项目,真的是非常的蠢。所有我决定把这个依赖项目砍掉(并不是说这个项目不好)。既然要砍掉它,那就要找到它的替代品,所以我就把目光投向了RecycleView了,使用RecycleView实现瀑布流布局其实还是非常的快的,只要把 

mLayoutManager=newStaggeredGridLayoutManager(2,OrientationHelper.VERTICAL); 

就可以实现了。

关键还是在于实现下拉刷新和加载更多。下拉刷新在上面已经讲到怎么实现了,下面开始讲加载更多

在RecycleView中是没有onItemClickLinstener,OnItemLongClickListener以及加载更多等等的接口的。这一切都是要是自己实现的。本着不重复造轮子的精神,我先上google了一下。

发现大多是这样子的

拉刷新和上拉加载更多的RecyclerView,具有下拉和刷新动画

实现RecyclerView下拉刷新和上拉加载更多以及RecyclerView线性、网格、瀑布流效果演示

What the hell?(并没有说这样子的方法不科学,只是可以更简单的解决)

我只是要简单的实现加载更多,有必要改动这么多,还要增加footerview,还有对RecycleView增加OnScrollLinstener来监听是否到达最后一条,还有用 mLayoutManager.findLast...关键是瀑布流的layoutmanager还没有这个接口。。。

于是就开始思考,竟然单击事件,长按事件可以通过订阅的方式来实现,那么加载更多是不是也可以?

如果我在初始化Adapter的时候就告诉Adapter:如果到了最后一条数据就告诉我,我来加载更多。

本着这样的想法,我在Adapter的初始化总增加了这一个参数

ps:在评论中有同学指出如果不满一屏可能会频繁触发loadMoreListener,解决方法就是增加一个 参数 pageNum,用于判断当前数据满不满

publicListAdapter_pic(Context context,List listData,

OnItemClickListener listener,in.yeyeapp.listeners.OnLoadMoreListener loadMoreListener,int pageNum) {

mListener= listener;

mContext= context.getApplicationContext();

this.mInflater= LayoutInflater.from(mContext);

this.data= listData;

this.pageNum = pageNum;

//订阅加载更多

this.loadMoreListener= loadMoreListener;

}

实现加载更多的具体做法

mAdapter=newListAdapter_pic(getActivity(),mListAlbums,(OnItemClickListener)this, newOnLoadMoreListener() {

@Override

public voidonLoadMore() {

currentPage++;

nextPage();

}

});

OnLoadMore的具体实现

public interfaceOnLoadMoreListener {

public voidonLoadMore();

}

接下来是在合适的时候触发事件。

仔细阅读Adapter的代码我们会发现 onBindViewHolder 是负责绘制ItemView的函数,所以它是知道它当前已经画到第一几个Item了,所以这项重任就交给它了

@Override

public voidonBindViewHolder(ViewHolder holder, intposition) {

//新增对 loadMoreListener 的非空判断,以及对数据数目满屏的判断,防止触发空指针错误及数据不满而频繁触发加载更多

if(position == getItemCount() -1 && loadMoreListener != null && getCount() > pageNum) {

//告诉订阅者已经到最后一个了,可以加载更多了

loadMoreListener.onLoadMore();

}

//其他绑定资源的操作

。。。

}

这样,加载更多就大功告成了!!!

基本在网络良好的情况下,是可以无感的加载更多的

做法也是比较的简单

核心的思想就是让Adapter在绘制到最后一个view的时候告诉主线程说可以更新了。。。

如果想让加载更多更快一步执行,可以通过修改判断的条件

if(position == getItemCount() -1)

可以在倒数第二个,倒数第三个等就可以加载更多,这样可以让用户更加感知不到加载的过程

不过就要注意数据的个数了

如果这篇文章又帮到你的话,请点一下‘喜欢’,我会更努力的创作的

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 151,511评论 1 330
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 64,495评论 1 273
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 101,595评论 0 225
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 42,558评论 0 190
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 50,715评论 3 270
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 39,672评论 1 192
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,112评论 2 291
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,837评论 0 181
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,417评论 0 228
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,928评论 2 232
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,316评论 1 242
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,773评论 2 234
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,253评论 3 220
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,827评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,440评论 0 180
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 34,523评论 2 249
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 34,583评论 2 249

推荐阅读更多精彩内容