Android使用recyclerview打造真正的下拉刷新上拉加载效果

前言

前段时间需要用到recyclerview,就想找个封装好的下拉刷新,上拉加载的库,结果愣是没找到,便自己写了一个。

注意:我说的是“上拉加载”,不是滑到底部自动加载。 虽然现在自动加载是主流和趋势,但也不排除有时候就需要用到上拉加载啊,毕竟林子大了,什么样的产品经理都有对吧。

代码写好后,准备发布到bintray的时候,向同事征求这个项目的名字,同事说:“就叫DZTRecyclerview!” 不解,同事解释:“叼炸天Recyclerview!” 多么酷炫奢华有内涵!!于是,这个库就叫做WZMRecyclerview,恩,名字缩写就可以了,毕竟配不上DZT这个名字。

这篇文章先介绍如何使用这个recyclerview,之后如果我懒癌没有发作的话,再详细依次介绍整个项目的实现。

好了,进入正题。

简介

WZMRecyclerview 是一个集成了 下拉刷新、上拉加载、滑到底部自动加载、添加删除头尾部 四个主要功能的recyclerview,当然,还支持 自定义的刷新头部和加载底部、EmptyView、LoadingView、封装后的简单易用的adapter、封装后的简单易用的分割线等。

下面依次介绍:

1. 添加删除头尾部和点击事件
2. 下拉刷新
3. 上拉加载
4. 滑动到底部自动加载
5. 使用自定义的下拉刷新头部
6. 使用自定义的上拉加载尾部
7. 使用自定义的自动加载尾部

由于这个项目有四个主要功能,我没有采用全部集成在一个recyclerview的方式,而是采用继承的方式依次实现每个功能。继承关系如下:

HeaderAndFooterRecyclerView –> PullToRefreshRecyclerView –> PullToLoadRecyclerView,而AutoLoadRecyclerview也是继承自PullToRefreshRecyclerView.

因此,要是你问我HeaderAndFooterRecyclerView鸡不鸡齐下拉刷新,那当然是不鸡齐的!但PullToRefreshRecyclerView是鸡齐添加删除头尾部的。

使用

使用这个库,使用Android studio的同学先要在build.gradle加上依赖:

compile 'com.mrw:wzmrecyclerview:1.0.2'

使用eclipse的同学,可以上github把项目clone下来。当然,更好的办法是赶紧换成android studio。

添加删除头尾部和点击事件

HeaderAndFooterRecyclerView.addHeaderView(HeaderView);//添加头部
HeaderAndFooterRecyclerView.removeHeaderView(HeaderView);//删除头部
HeaderAndFooterRecyclerView.addFooterView(FooterView);//添加尾部
HeaderAndFooterRecyclerView.removeFooterView(FooterView);//删除尾部
HeaderAndFooterRecyclerView.setOnItemClickListener(OnItemClickListener onItemClickListener);//添加item点击事件监听
HeaderAndFooterRecyclerView.setOnItemLongClickListener(OnItemLongClickListener onItemLongClickListener);//添加item点击事件监听

和ListView的用法一致,就不详细说了。效果图:

头尾部

Grid头尾部

Staggred头尾部

下拉刷新

下拉刷新直接使用PullToRefreshRecyclerView就可以了,这里提供了几个方法:

PullToRefreshRecyclerView.setOnRefreshListener(OnRefreshListener onRefreshListener);//添加下拉刷新监听
PullToRefreshRecyclerView.setRefreshViewCreator(RefreshHeaderCreator refreshHeaderCreator);//使用自定义的下拉刷新头部
PullToRefreshRecyclerView.setRefreshEnable(boolean refreshEnable);//下拉刷新是否可用
PullToRefreshRecyclerView.setPullRatio(float pullRatio);//设置下拉阻尼系数
PullToRefreshRecyclerView.completeRefresh();//完成刷新

一般使用过程中,使用setOnRefreshListener监听下拉刷新,然后刷新完成后调用completeRefresh方法完成刷新就可以了。

上拉加载

上拉加载使用PullToLoadRecyclerView,提供的方法如下:

PullToLoadRecyclerView.setOnLoadListener(OnLoadListener onLoadListener);//添加上拉加载监听
PullToLoadRecyclerView.setLoadViewCreator(LoadFooterCreator loadViewCreator);//使用自定义的上拉加载尾部
PullToLoadRecyclerView.setLoadEnable(boolean loadMoreEnable);//上拉加载是否可用
PullToLoadRecyclerView.setPullLoadRatio(float loadRatio);//设置上拉阻尼系数
PullToLoadRecyclerView.completeLoad();//完成加载

一般使用过程中,使用setOnLoadListener监听上拉加载,然后加载完成后调用completeLoad方法完成加载就可以了。

注意:上拉加载中的LayoutManager推荐使用WZMLinearLayoutManager、WZMGridLayoutManager, 至于原因会在后面的文章中说明。

效果图:

刷新加载

Grid刷新加载

Staggred刷新加载

滑动到底部自动加载

自动加载使用AutoLoadRecyclerView,提供的方法如下:

AutoLoadRecyclerView.setOnLoadListener(OnLoadListener onLoadListener);//添加加载监听
AutoLoadRecyclerView.setAutoLoadViewCreator(AutoLoadFooterCreator autoLoadFooterCreator);//使用自定义的自动加载尾部
AutoLoadRecyclerView.completeLoad();//完成加载
AutoLoadRecyclerView.setNoMore(boolean noMore);//设置没有更多数据

一般使用过程中,使用setOnLoadListener监听自动加载,然后加载完成后调用completeLoad方法完成加载,当没有更多数据时,调用setNoMore方法就可以了。

效果图:

Grid自动加载

使用自定义的下拉刷新头部

所有不支持自定义刷新加载view的项目都是耍流氓,所以,我们支持了自定义的刷新头部和加载尾部。这句话有没有老罗的感觉?

自定义的下拉刷新头部其实很简单,如果你看了上面下拉刷新的介绍,你会发现一个方法:

PullToRefreshRecyclerView.setRefreshViewCreator(RefreshHeaderCreator refreshHeaderCreator);//使用自定义的下拉刷新头部

没错,这个就是设置自定义下拉刷新头部的方法,那个这个RefreshHeaderCreator到底是个什么东西呢?其实它是个抽象类,你只要继承它实现抽象方法就可以了,它有三个方法需要实现:

/**
* 下拉
* @param distance 距离
* @return 下拉距离,返回true表示可以继续下拉
*/
public abstract boolean onStartPull(float distance, int lastState);
/**
* 松手刷新
* @param distance 距离
* @return 下拉距离,返回true表示可以继续下拉
*/
public abstract boolean onReleaseToRefresh(float distance,int lastState);
/**开始刷新*/
public abstract void onStartRefreshing();
/**刷新结束*/
public abstract void onStopRefresh();

是不是炒鸡简单?

继承RefreshHeaderCreator

调用setRefreshViewCreator方法

没了

其中onStartPull方法是指下拉过程,传入两个参数:一个距离(distance),一个是上次的状态(lastState)。distance可以让你自己根据距离完成自己的下拉头部内部的动画,lastState让你知道”下拉刷新”、”松手立即刷新”两个状态的切换。

onReleaseToRefresh和onStartPull是一样的。

使用自定义的上拉加载尾部

这个其实和自定义的下拉刷新头部是一样样的,

PullToLoadRecyclerView.setLoadViewCreator(LoadFooterCreator loadViewCreator);//使用自定义的上拉加载尾部

来看看这个LoadFooterCreator:

/**
* 上拉
* @param distance 距离
* @return 是否继续上拉
*/
protected abstract boolean onStartPull(float distance,int lastState);
/**
* 松手加载
* @param distance 距离
* @return 是否继续上拉
*/
protected abstract boolean onReleaseToLoad(float distance,int lastState);
/**开始加载*/
protected abstract void onStartLoading();
/**加载结束*/
protected abstract void onStopLoad();

哦,和RefreshHeaderCreator一毛一样,那就不说了。

使用自定义的自动加载尾部

还是一样:

AutoLoadRecyclerView.setAutoLoadViewCreator(AutoLoadFooterCreator autoLoadFooterCreator);//使用自定义的自动加载尾部

看看AutoLoadFooterCreator:

/***
* 获得footer
*/
protected abstract View getLoadView(Context context, RecyclerView recyclerView);
/***
* 没有更多
*/
protected abstract View getNoMoreView(Context context,RecyclerView recyclerView);

恩,更简单了,就两个方法,获得加载中的尾部、没有更多的尾部。

so easy!!

后记

在之后,我会抽时间对这个项目的实现过程进行详细的介绍。

源码地址:https://github.com/whichname/WZMRecyclerView

(0)

相关推荐

  • Android下拉刷新上拉加载控件(适用于所有View)

    前面写过一篇关于下拉刷新控件的文章下拉刷新控件终结者:PullToRefreshLayout,后来看到好多人还有上拉加载更多的需求,于是就在前面下拉刷新控件的基础上进行了改进,加了上拉加载的功能.不仅如此,我已经把它改成了对所有View都通用!可以随心所欲使用这两个功能~~ 我做了一个大集合的demo,实现了ListView.GridView.ExpandableListView.ScrollView.WebView.ImageView.TextView的下拉刷新和上拉加载.后面会提供demo的

  • Android RecyclerView 上拉加载更多及下拉刷新功能的实现方法

    RecyclerView 已经出来很久了,但是在项目中之前都使用的是ListView,最近新的项目上了都大量的使用了RecycleView.尤其是瀑布流的下拉刷新,网上吧啦吧啦没有合适的自己总结了一哈. 先贴图上来看看: 使用RecyclerView实现上拉加载更多和下拉刷新的功能我自己有两种方式: 1.使用系统自带的Android.support.v4.widget.SwipeRefreshLayout这个控价来实现. 2.自定义的里面带有RecyleView的控件. 使用RecycleVie

  • Android中使用RecyclerView实现下拉刷新和上拉加载

    推荐阅读:使用RecyclerView添加Header和Footer的方法                       RecyclerView的使用之HelloWorld RecyclerView 是Android L版本中新添加的一个用来取代ListView的SDK,它的灵活性与可替代性比listview更好.本文给大家介绍如何为RecyclerView添加下拉刷新和上拉加载,过去在ListView当中添加下拉刷新和上拉加载是非常方便的利用addHeaderView和addFooterVie

  • Android ListView下拉刷新上拉自动加载更多DEMO示例

    代码下载地址已经更新.因为代码很久没更新,已经很落伍了,建议大家使用RecyclerView实现. 参考项目: https://github.com/bingoogolapple/BGARefreshLayout-Android https://github.com/baoyongzhang/android-PullRefreshLayout 下拉刷新,Android中非常普遍的功能.为了方便便重写的ListView来实现下拉刷新,同时添加了上拉自动加载更多的功能.设计最初是参考开源中国的And

  • Android实现上拉加载更多以及下拉刷新功能(ListView)

    首先为大家介绍Andorid5.0原生下拉刷新简单实现. 先上效果图: 相对于上一个19.1.0版本中的横条效果好看了很多.使用起来也很简单. <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/container" and

  • Android下拉刷新上拉加载更多左滑动删除

    一.前言 老规矩,别的不说,这demo是找了很相关知识集合而成的,可以说对我这种小白来说是绞尽脑汁!程序员讲的是无图无真相! 现在大家一睹为快! 二.比较关键的还是scroller这个类的 package com.icq.slideview.view; import android.content.Context; import android.util.AttributeSet; import android.util.Log; import android.util.TypedValue;

  • Android RecyclerView实现下拉刷新和上拉加载

    RecyclerView已经出来很久了,许许多多的项目都开始从ListView转战RecyclerView,那么,上拉加载和下拉刷新是一件很有必要的事情. 在ListView上,我们可以通过自己添加addHeadView和addFootView去添加头布局和底部局实现自定义的上拉和下拉,或者使用一些第三方库来简单的集成,例如Android-pulltorefresh或者android-Ultra-Pull-to-Refresh,后者的自定义更强,但需要自己实现上拉加载. 而在下面我们将用两种方式

  • Android官方下拉刷新控件SwipeRefreshLayout使用详解

    可能开发安卓的人大多数都用过很多下拉刷新的开源组件,但是今天用了官方v4支持包的SwipeRefreshLayout觉得效果也蛮不错的,特拿出来分享. 简介: SwipeRefreshLayout组件只接受一个子组件:即需要刷新的那个组件.它使用一个侦听机制来通知拥有该组件的监听器有刷新事件发生,换句话说我们的Activity必须实现通知的接口.该Activity负责处理事件刷新和刷新相应的视图.一旦监听者接收到该事件,就决定了刷新过程中应处理的地方.如果要展示一个"刷新动画",它必须

  • 使用MUI框架模拟手机端的下拉刷新和上拉加载功能

    mui框架基于htm5plus的XMLHttpRequest,封装了常用的Ajax函数,支持GET.POST请求方式,支持返回json.xml.html.text.script数据类型: 本着极简的设计原则,mui提供了mui.ajax方法,并在mui.ajax方法基础上,进一步简化出最常用的mui.get().mui.getJSON().mui.post()三个方法. 套用mui官方文档的一句话:"开发者只需关心业务逻辑,实现加载更多数据即可".真的是不错的框架. 想更多的了解这个框

  • 基于iScroll实现下拉刷新和上滑加载效果

    本文实例为大家分享了iScroll下拉刷新上滑加载展示的具体代码,供大家参考,具体内容如下 html代码: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <meta name="viewport" content="width=devi

  • android RecyclerView侧滑菜单,滑动删除,长按拖拽,下拉刷新上拉加载

    本文介绍的库中的侧滑效果借鉴自SwipeMenu,并对SipwMenu的源码做了修改与Bug修复,然后才开发出的SwipeRecyclerView. 需要说明的是,本库没有对RecyclerView做大的修改,只是ItemView的封装.看起来是对RecyclerView的修改,其实仅仅是为RecyclerView添加了使用的方法API而已. 本库已经更新了三个版本了,会一直维护下去,根据小伙伴的要求,以后也会添加一些其它功能. SwipeRecyclerView将完美解决这些问题: 以下功能全

  • RecyclerView下拉刷新上拉加载

    一 .前言 最近实在太忙,一个多礼拜没有更新文章了,于是今晚加班加点把demo写出来,现在都12点了才开始写文章. 1.我们的目标 把RecyclerView下拉刷新上拉加载更多加入到我们的开发者头条APP中. 2.效果图 3.实现步骤 找一个带上拉刷新下载加载更多的RecyclerView开源库,我们要站在巨人的肩膀上 下载下来自己先运行下demo,然后看看是不是我们需要的功能,觉得不错就把module依赖进来,整合主项目. 整合进来了之后,我们肯定需要进行修改,例如我这边就有滑动冲突,有多个

  • Android自定义下拉刷新上拉加载

    本文实例为大家分享了Android自定义下拉刷新上拉加载的具体实现步骤,供大家参考,具体内容如下 实现的方式是SwipeRefreshLayout + RecyclerView 的VIewType 首先看效果: 总的思路: 布局文件 <android.support.v4.widget.SwipeRefreshLayout android:layout_marginTop="?attr/actionBarSize" android:id="@+id/one_refres

  • Android手把手教大家制作APP首页(下拉刷新、自动加载)

    一.概述 作为一名三年Android开发经验的程序员,今天和大家一起实战一款APP的首页功能,这个首页在我们平时接触中还是很常见的,虽然页面简单,但是里面涉及的功能点还是挺多的.代码如有不足的还望各路同仁指点一二. 页面中使用的开发库: 整个首页架构使用的是LRecyclerView,包含下拉刷新和自动加载功能 compile 'com.github.jdsjlzx:LRecyclerView:1.3.3' 无限循环轮播图使用的是convenientbanner,效果还是很顺畅的,还可以根据自己

  • Android 仿硅谷新闻下拉刷新/上拉加载更多

    1.添加加载更多布局 1_初始化和隐藏代码 在RefreshListView构造方法中调用 private void initFooterView(Context context) { View footerView = View.inflate(context, R.layout.refresh_listview_footer, null); //隐藏代码 footerView.measure(0, 0); int footerViewHeight = footerView.getMeasur

  • Android程序开发之Listview下拉刷新上拉(滑动分页)加载更多

    最近做的类似于微博的项目中,有个Android功能要使用到listview的向下拉刷新来刷新最新消息,向上拉刷新(滑动分页)来加载更多. 新浪微博就是使用这种方式的典型. 当用户从网络上读取微博的时候,如果一下子全部加载用户未读的微博这将耗费比较长的时间,造成不好的用户体验,同时一屏的内容也不足以显示如此多的内容.这时候,我们就需要用到另一个功能,那就是listview的分页了,其实这个分页可以做成客户端的分页,也可以做成服务器端的分页(点击加载时,从服务器对应的加载第N页就好了!!!).通过分

  • android使用PullToRefresh框架实现ListView下拉刷新上拉加载更多

    本文实例为大家分享了Android实现ListView下拉刷新上拉加载更多的具体代码,供大家参考,具体内容如下 其实谷歌官方目前已经推出ListView下拉刷新框架SwipeRefreshLayout,想了解的朋友可以点击 android使用SwipeRefreshLayout实现ListView下拉刷新上拉加载了解一下: 大家不难发现当你使用SwipeRefreshLayout下拉的时候布局文件不会跟着手势往下滑,而且想要更改这个缺陷好像非常不容易. 虽然SwipeRefreshLayout非

随机推荐