1.说明:

SmartRefreshLayout的目标是打造一个强大,稳定,成熟的下拉刷新框架,并集成各种的炫酷、多样、实用、美观的Header和Footer。它不只是支持所有的View,还支持多层嵌套的视图结构。它继承自ViewGroup 而不是FrameLayout或LinearLayout,提高了性能。 也吸取了现在流行的各种刷新布局的优点,包括谷歌官方的 SwipeRefreshLayout,其他第三方的 Ultra-Pull-To-Refresh、TwinklingRefreshLayout 等等。

2.特点:

1.支持多点触摸
2.支持嵌套多层的视图结构 Layout (LinearLayout,FrameLayout...)
3.支持所有的 View(AbsListView、RecyclerView、WebView....View)
4.支持自定义并且已经集成了很多炫酷的 Header 和 Footer.
5.支持和ListView的无缝同步滚动 和 CoordinatorLayout 的嵌套滚动 .
6.支持自动刷新、自动上拉加载(自动检测列表惯性滚动到底部,而不用手动上拉).
7.支持自定义回弹动画的插值器,实现各种炫酷的动画效果.
8.支持设置主题来适配任何场景的App,不会出现炫酷但很尴尬的情况.
9.支持设多种滑动方式:平移、拉伸、背后固定、顶层固定、全屏
10.支持所有可滚动视图的越界回弹

参考案例:案例地址        自定义头部与底部样式      相关属性

3.项目演示(1):

上图就是第一种效果,下面来看看如何实现:

a.在 buld.gradle 中添加依赖

//发现bug请加群提出,并切换 1.0.3 版本
compile 'com.scwang.smartrefresh:SmartRefreshLayout:1.0.4-4'
compile 'com.scwang.smartrefresh:SmartRefreshHeader:1.0.4-4'//没有使用特殊Header,可以不加这行compile 'com.android.support:appcompat-v7:25.3.1'//版本随意(必须)
compile 'com.android.support:design:25.3.1'//版本随意(非必须,引用可以解决无法预览问题)//稳定版
compile 'com.scwang.smartrefresh:SmartRefreshLayout:1.0.3'
compile 'com.scwang.smartrefresh:SmartRefreshHeader:1.0.3'//没有使用特殊Header,可以不加这行

注意:上面的1.0.3依赖亲测,下拉没有问题,上拉加载有时在activity中数据较少时拉不出啦,只有数据满一屏时才可以上拉,后拉使用了下面的依赖:1.0.5.1 这个无论数据多少都可以上拉

//1.1.0 API改动过大,老用户升级需谨慎
compile 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0-alpha-14'
compile 'com.scwang.smartrefresh:SmartRefreshHeader:1.1.0-alpha-14'//没有使用特殊Header,可以不加这行
compile 'com.android.support:appcompat-v7:25.3.1'//版本 23以上(必须)//1.0.5 当1.1.0出现问题可以回退到1.0.5.1
compile 'com.scwang.smartrefresh:SmartRefreshLayout:1.0.5.1'
compile 'com.scwang.smartrefresh:SmartRefreshHeader:1.0.5.1'//没有使用特殊Header,可以不加这行
compile 'com.android.support:appcompat-v7:25.3.1'//版本 23以上(必须)
compile 'com.android.support:design:25.3.1'//版本随意(非必须,引用可以解决无法预览问题)

其中有一个依赖若是studio3.0以上编译不过的话,可以直接不加:

compile 'com.android.support:design:25.3.1'//版本随意(非必须,引用可以解决无法预览问题,编译不过,可以不加)

b.布局XML文件:

<?xml version="1.0" encoding="utf-8"?>
<com.scwang.smartrefresh.layout.SmartRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/refreshLayout"android:layout_width="match_parent"android:layout_height="match_parent"><android.support.v7.widget.RecyclerViewandroid:id="@+id/recyclerview"android:layout_width="match_parent"android:layout_height="match_parent"android:overScrollMode="never"android:background="#fff" />
</com.scwang.smartrefresh.layout.SmartRefreshLayout>

c.使用指定的 Header 和 Footer:

import android.app.Application;
import android.content.Context;import com.scwang.smartrefresh.layout.SmartRefreshLayout;
import com.scwang.smartrefresh.layout.api.DefaultRefreshFooterCreater;
import com.scwang.smartrefresh.layout.api.DefaultRefreshHeaderCreater;
import com.scwang.smartrefresh.layout.api.RefreshFooter;
import com.scwang.smartrefresh.layout.api.RefreshHeader;
import com.scwang.smartrefresh.layout.api.RefreshLayout;
import com.scwang.smartrefresh.layout.footer.ClassicsFooter;
import com.scwang.smartrefresh.layout.header.ClassicsHeader;/***  sgf**/
public class App extends Application {//static 代码段可以防止内存泄露static {//设置全局的Header构建器SmartRefreshLayout.setDefaultRefreshHeaderCreater(new DefaultRefreshHeaderCreater() {@Overridepublic RefreshHeader createRefreshHeader(Context context, RefreshLayout layout) {layout.setPrimaryColorsId(R.color._f1f1f1, android.R.color.black);//全局设置主题颜色return new ClassicsHeader(context);//.setTimeFormat(new DynamicTimeFormat("更新于 %s"));//指定为经典Header,默认是 贝塞尔雷达Header}});//设置全局的Footer构建器SmartRefreshLayout.setDefaultRefreshFooterCreater(new DefaultRefreshFooterCreater() {@Overridepublic RefreshFooter createRefreshFooter(Context context, RefreshLayout layout) {//指定为经典Footer,默认是 BallPulseFooterreturn new ClassicsFooter(context).setDrawableSize(20);}});}
}

b.主要逻辑代码:

import android.content.Context;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.Window;
import android.widget.Toast;import com.scwang.smartrefresh.header.MaterialHeader;
import com.scwang.smartrefresh.layout.api.RefreshLayout;
import com.scwang.smartrefresh.layout.constant.SpinnerStyle;
import com.scwang.smartrefresh.layout.footer.BallPulseFooter;
import com.scwang.smartrefresh.layout.listener.OnLoadmoreListener;
import com.scwang.smartrefresh.layout.listener.OnRefreshListener;public class MainActivity extends AppCompatActivity {private RecyclerView mRvMain;private Context context;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//去掉头部的方法之一requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(R.layout.activity_main);context = MainActivity.this;init();}private void init() {mRvMain=(RecyclerView) findViewById(R.id.recyclerview);mRvMain.setLayoutManager(new LinearLayoutManager(MainActivity.this));mRvMain.setAdapter(new LinearAdapter(MainActivity.this));RefreshLayout refreshLayout = (RefreshLayout)findViewById(R.id.refreshLayout);//设置 Header 为 贝塞尔雷达 样式refreshLayout.setRefreshHeader(new BezierRadarHeader(this).setEnableHorizontalDrag(true));//设置 Header 为 Material样式refreshLayout.setRefreshHeader(new MaterialHeader(this).setShowBezierWave(true));//设置 Footer 为 球脉冲refreshLayout.setRefreshFooter(new BallPulseFooter(this).setSpinnerStyle(SpinnerStyle.Scale));refreshLayout.setOnRefreshListener(new OnRefreshListener() {@Overridepublic void onRefresh(RefreshLayout refreshlayout) {refreshlayout.finishRefresh(2000/*,false*/);//传入false表示刷新失败Toast.makeText(context,"刷新",Toast.LENGTH_SHORT).show();}});refreshLayout.setOnLoadmoreListener(new OnLoadmoreListener() {@Overridepublic void onLoadmore(RefreshLayout refreshlayout) {refreshlayout.finishLoadmore(2000/*,false*/);//传入false表示加载失败Toast.makeText(context,"加载",Toast.LENGTH_SHORT).show();}});}
}

c.适配器模拟数据:

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 android.widget.Toast;
import java.util.ArrayList;
import java.util.List;/*** sgf*/
public class LinearAdapter extends RecyclerView.Adapter <LinearAdapter.LinearViewHolder>{//contextprivate Context mContext;//展示的数据private List<String> list=new ArrayList<>();public LinearAdapter(Context context){this.mContext=context;for(int i=0;i<30;i++){list.add(String.format("%s-%s", i/10+1,i));}}//onCreateViewHolder方法创建一个viewHolder,viewholder可以理解为一条数据的展示布局,这里我们自定义类LinearViewHolder创建一个只有TextView的item//这里我们需要创建每条布局使用的layout:layout_linear_item@Overridepublic LinearAdapter.LinearViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {return new LinearViewHolder(LayoutInflater.from(mContext).inflate(R.layout.layout_linear_item,parent,false));}//onBindViewHolder方法为item的UI绑定展示数据,@Overridepublic void onBindViewHolder(LinearAdapter.LinearViewHolder holder, int position) {holder.textView.setText(String.format("Hello World %s", list.get(position)));}//item的总长度@Overridepublic int getItemCount() {return 30;}//LinearViewHolder可以看作一个item的展示和内部逻辑处理,故而如果需要绑定事件,获取控件的时候要在itemView中获取//itemView由onCreateViewHolder方法LayoutInflater.inflatec创建class LinearViewHolder extends RecyclerView.ViewHolder{private TextView textView;public LinearViewHolder(View itemView){super(itemView);textView=(TextView) itemView.findViewById(R.id.tv_main);//简单事件处理textView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Toast.makeText(mContext,textView.getText().toString(),Toast.LENGTH_SHORT).show();}});}}
}

d.另一种设置布局颜色的方法:

<?xml version="1.0" encoding="utf-8"?>
<com.scwang.smartrefresh.layout.SmartRefreshLayout xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/refreshLayout"android:layout_width="match_parent"android:layout_height="match_parent"android:background="#444444"app:srlPrimaryColor="#444444"app:srlAccentColor="@android:color/white"app:srlEnablePreviewInEditMode="true"><!--srlAccentColor srlPrimaryColor 将会改变 Header 和 Footer 的主题颜色--><!--srlEnablePreviewInEditMode 可以开启和关闭预览功能--><com.scwang.smartrefresh.layout.header.ClassicsHeaderandroid:layout_width="match_parent"android:layout_height="wrap_content"/><android.support.v7.widget.RecyclerViewandroid:id="@+id/recyclerview"android:layout_width="match_parent"android:layout_height="match_parent"android:overScrollMode="never"android:background="#fff" /><com.scwang.smartrefresh.layout.footer.ClassicsFooterandroid:layout_width="match_parent"android:layout_height="wrap_content"/>
</com.scwang.smartrefresh.layout.SmartRefreshLayout>

如下图,设置了颜色:

4.项目演示(2):

SmartRefreshLayout  ClassicsFooter效果:

a.以上述代码为例,直接在函数代码中注释下面两行代码便是上图效果:

(根据Header的样式来设置效果)

 //设置 Header 为 贝塞尔雷达 样式//refreshLayout.setRefreshHeader(new BezierRadarHeader(this).setEnableHorizontalDrag(true));  //设置 Header 为 Material样式
//        refreshLayout.setRefreshHeader(new MaterialHeader(this).setShowBezierWave(true));//设置 Footer 为 球脉冲
//        refreshLayout.setRefreshFooter(new BallPulseFooter(this).setSpinnerStyle(SpinnerStyle.Scale));

还要加上对应的布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context="com.freshdemo.MainActivity"android:orientation="vertical"><com.scwang.smartrefresh.layout.SmartRefreshLayoutandroid:id="@+id/refreshLayout"android:layout_width="match_parent"android:layout_height="match_parent"app:srlAccentColor="#00000000"app:srlPrimaryColor="#00000000"app:srlEnablePreviewInEditMode="true"><com.scwang.smartrefresh.layout.header.ClassicsHeaderandroid:layout_width="match_parent"android:layout_height="wrap_content"/><android.support.v7.widget.RecyclerViewandroid:id="@+id/rv"android:layout_width="match_parent"android:layout_height="match_parent"/><com.scwang.smartrefresh.layout.footer.ClassicsFooterandroid:layout_width="match_parent"android:layout_height="wrap_content"/></com.scwang.smartrefresh.layout.SmartRefreshLayout></LinearLayout>

b.设置Header 和 Footer的背景颜色(在app类中):

public class App extends Application {//static 代码段可以防止内存泄露static {//设置全局的Header构建器SmartRefreshLayout.setDefaultRefreshHeaderCreater(new DefaultRefreshHeaderCreater() {@Overridepublic RefreshHeader createRefreshHeader(Context context, RefreshLayout layout) {layout.setPrimaryColorsId(R.color.colorPrimary, android.R.color.white);//全局设置主题颜色return new ClassicsHeader(context);//.setTimeFormat(new DynamicTimeFormat("更新于 %s"));//指定为经典Header,默认是 贝塞尔雷达Header}});//设置全局的Footer构建器SmartRefreshLayout.setDefaultRefreshFooterCreater(new DefaultRefreshFooterCreater() {@Overridepublic RefreshFooter createRefreshFooter(Context context, RefreshLayout layout) {//指定为经典Footer,默认是 BallPulseFooterreturn new ClassicsFooter(context).setDrawableSize(20);}});}
}
app:srlAccentColor="#00000000"//设置Header主题颜色app:srlPrimaryColor="#00000000"//设置Footer主题颜色app:srlEnablePreviewInEditMode="true"//开启和关闭预览功能

c.启动和关闭加载、刷新

开始下拉
mRefreshLayout.setEnableRefresh(true);//启用刷新
mRefreshLayout.setEnableLoadmore(true);//启用加载
关闭下拉
mRefreshLayout.finishRefresh();
mRefreshLayout.finishLoadmore();

d.一个绚丽的PhoenixHeader展示:

使用如下布局即可:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context="com.freshdemo.MainActivity"android:orientation="vertical"><com.scwang.smartrefresh.layout.SmartRefreshLayoutandroid:id="@+id/refreshLayout"android:layout_width="match_parent"android:layout_height="match_parent"app:srlAccentColor="#00000000"app:srlPrimaryColor="#00000000"app:srlEnablePreviewInEditMode="true"><com.scwang.smartrefresh.header.PhoenixHeaderandroid:layout_width="match_parent"android:layout_height="wrap_content"/><android.support.v7.widget.RecyclerViewandroid:id="@+id/rv"android:layout_width="match_parent"android:layout_height="match_parent"/><com.scwang.smartrefresh.layout.footer.BallPulseFooterandroid:layout_width="match_parent"android:layout_height="wrap_content"/></com.scwang.smartrefresh.layout.SmartRefreshLayout></LinearLayout>

效果如下:

下面列举一下可以直接替换的不同动画对应的类(主要是替换下面的类名即可实现对应的动画效果):

<com.scwang.smartrefresh.header.FlyRefreshandroid:layout_width="match_parent"android:layout_height="wrap_content"/>
1.Delivery 气球快递
2.PhoenixHeader 金色校园

e.贝塞尔雷达 样式

5.SmartRefreshLayout可以引入好几种Header和Footer样式,其中footer固定样式有三种,在refresh-layout包下:

包的路径分别是:

com.scwang.smartrefresh.layout.footer.BallPulseFooter
com.scwang.smartrefresh.layout.footer.ClassicsFooter
com.scwang.smartrefresh.layout.footer.FalsifyFooter

header样式则很多,在refresh-layout包下有:

包路径分别是:

com.scwang.smartrefresh.layout.header.BezierRadarHeader
com.scwang.smartrefresh.layout.header.ClassicsHeader
com.scwang.smartrefresh.layout.header.FalsifyHeader

在refresh-header包下有以下样式:

包路径是:

com.scwang.smartrefresh.header.BezierCircleHeader
......//下面都是类似的

Android 智能上拉加载下拉刷新框架之SmartRefreshLayout相关推荐

  1. php微信小程序向下滑动,微信小程序功能实现:上滑加载下拉刷新

    本篇文章给大家带来的内容是关于微信小程序功能实现:上滑加载下拉刷新,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 之前谈到文章列表的数据加载,是一次性全部加载,这样是不友好的.这章介 ...

  2. ionic上拉加载-下拉刷新

    ionic上拉加载-下拉刷新 1.上拉加载 <ion-infinite-scroll on-infinite="loadOlderStories()" distance=&q ...

  3. Mint-ui中loadmore(上拉加载下拉刷新)组件在ios中滑动会触发点击事件的解决方法...

    bug说明: Mint-ui中loadmore(上拉加载下拉刷新)组件 在 使用fastclick的情况下 ,在ios设备中滑动会触发点击事件: 解决方法: 我是按需引入,去项目中找到loadmore ...

  4. php mescroll,mescroll.js上拉加载下拉刷新组件使用详解

    本文实例为大家分享了上拉加载下拉刷新组件mescroll.js的具体代码,供大家参考,具体内容如下 使用注意事项: 1.引入的时候出问题及时看官方给出的解决方案(基本上都必须看): 2.react中一 ...

  5. 教你如何使用SwipeRefreshLayout来构建一个上拉加载下拉刷新框架

    前言: 基本上所以的移动端应用都有Listview(当然RecyclerView也一样),那必不可少的都会嵌入一个上拉加载下拉刷新的功能.这样能大大的减少用户的流量消耗,同样对于用户也有更好的用户体验 ...

  6. ios 上拉加载 下拉刷新

    在一款 App应用中有的时候会用到上拉加载下拉刷新的功能,本人觉得SVPullToRefresh很好用(可以用在UIScrollView上,包括UITableview和UICollectionView ...

  7. h5结合vant框架,实现列表上拉加载下拉刷新

    最近在做h5移动页面开发,并且需要用移动端android和ios将h5嵌进去.在开发过程中,使用了vant这个框架: vant文档:https://youzan.github.io/vant/#/zh ...

  8. 图片自动轮播+上拉加载下拉刷新+侧滑菜单+小圆点

    //效果图如下 //添加权限 <uses-permission android:name="android.permission.INTERNET"></uses ...

  9. 开发者头条(五):实现recyclerview的上拉加载 + 下拉刷新

    学习Ansen的博客,原文:带你实现开发者头条APP(五)–RecyclerView下拉刷新上拉加载 ,这一篇写的很详细. 知识点 今天主要是实现recyclerview的上拉加载跟多和下拉刷新,依赖 ...

最新文章

  1. vba 编辑combobox内容_初识Visual Basic编辑器并建立一段简单的代码
  2. HDU5934(强连通分量)
  3. java io 网络编程_[笔面] Java IO和网络编程相关面试
  4. 玩聚的Blog墙 VIII
  5. 无毛刺的时钟切换电路(Glitch-free clock switching circuit)设计(Verilog)
  6. MySQL 字符串删除表情符_PHP处理字符中的emoji表情(判断/移除/存储)
  7. python正则表达式面试_【正则表达式Python面试题】面试问题:Scrapy之… - 看准网...
  8. Robots at Warehouse(搜索+vector的使用)
  9. Oracle数据库学习(一)安装和简单使用
  10. JS(截取字符串,显示当前系统时间yyyy-MM-dd,从文本框得到的数值计算)
  11. oracle索引机制
  12. Post/Redirect/Get模式防止表单重复提交
  13. db4o官方入门教程翻译--06.集合和数组
  14. Exchange 2010部署
  15. Aiseesoft Data Recovery从硬盘驱动器恢复丢失的数据的方法
  16. java中this和this()区别
  17. Win10内置一台虚拟机的安装
  18. SECS协议基础知识
  19. 尚硅谷Maven2022----②单一架构案例
  20. 计算机最近被访问的文件夹,电脑复制文件夹提示“目标文件夹访问被拒绝”怎么办?[多图]...

热门文章

  1. 适合中小企业的知识库软件有哪些?
  2. Ubuntu系统Root用户无法登录
  3. 安装、卸载nginx(基于Centos7)
  4. 语音识别技术简述(概念-原理)
  5. securecrt端口转发socks4/5 代理服务器
  6. win7计算机不显计算机,电脑教程:win7输入法不显示怎么办
  7. adobe reader(PDF)数字证书添加
  8. 如何做好自媒体短视频?大周教你一招
  9. 怎么把几百页的PDF按目录拆分成多个单独的文件?
  10. html隐藏后保持占有的位置,每日一题