框架?下拉刷新控件还能框架化?智能又怎么回事?二话不多少先上Demo效果图,咱们再来探个究竟。

Github 传送门
注意:本文仅仅是博客文章,主要用于项目介绍和宣传,由于发布时间关系,部分内容已经过期,详细使用文档请跳转 github


Demo

下载 APK-Demo

如果手机上看不到图片,可以尝试

  • 点击浏览器查看
  • 点击Github传送门
  • 使用电脑浏览

项目演示


风格演示


框架

如果你看完了效果图,或许框架的意思应该有所了解了~~SmartRefreshLayout对下拉刷新功能进行系统的拆分、组合,主要由四个部分组成:

  • RefreshLayout 下拉的基本功能,包括布局测量、滑动事件处理、参数设定等等
  • RefreshContent 对不同内容的统一封装,包括判断是否可滚动、回弹判断、智能识别
  • RefreshHeader 下拉头部的实现和显示
  • RefreshFooter 上拉底部的实现和显示

下面是UML关系类图

通过SmartRefreshLayout框架,你可以在一个稳定强大的下拉布局中实现自己项目需求的 Header ,不用去关心滑动事件处理,不用关心子控件的回弹和滚动边界,只需关注自己真正的项目需求Header的样子和动画。

特点

这时你会问:网上其他的开源下拉控件一样的可以自定义 Header 和 Footer ,SmartRefreshLayout 和它们比起来有什么优势?

变换方式

  • Translate 平行移动 特点: 最常见,HeaderView高度不会改变,
  • Scale 拉伸形变 特点:在下拉和上弹(HeaderView高度改变)时候,会自动触发OnDraw事件
  • FixedFront 固定在前面 特点:不会上下移动,HeaderView高度不会改变
  • FixedBehind 固定在后面 特点:不会上下移动,HeaderView高度不会改变(类似微信浏览器效果)
  • Screen 全屏幕 特点:固定在前面,尺寸充满整个布局

SmartRefreshLayout 的Header和Footer都有多种变换方式,适应不同风格的 Header 和 Footer,下面是不同变换方式Header的Demo

FixedBehind 固定在后面Scale 拉伸形变

Screen 全屏幕Translate 平行移动

独立事件

Header和Footer 可以独立的处理手指滑动事件来为动画提供操作指令,也可以使用RefreshLayout的核心接口来完成一些不寻常的操作指令。
下面的打砖块 Header中 ,Header可以独立的使用滑动事件来为游戏挡板提供指令,并同时可以调用核心接口来通知RefreshLayout上下滚动列表


智能

智能是什么玩意?有什么用?智能主要体现 SmartRefreshLayout 对未知布局的自动识别上,这样可以让我们更高效的实现我们所需的功能,也可以实现一些非寻常的功能。下面通过自定义Header嵌套Layout作为内容 来解释 SmartRefreshLayout 的智能之处。

自定义Header

我们来看这一下这个伪代码例子:

    <SmartRefreshLayout><ClassicsHeader/><TextView/><ClassicsFooter/></SmartRefreshLayout>

在Android Studio 中的预览效果图

对比代码和我们预想的一样,那我们来对代码做一些改动,ClassicsHeader换成一个简单的TextView,看看会发生什么?

    <SmartRefreshLayout><TextView
            android:layout_width="match_parent"android:layout_height="100dp"android:gravity="center"android:background="#444"android:textColor="#fff"android:text="看看我会不会变成Header"/><TextView/><ClassicsFooter/></SmartRefreshLayout>

在Android Studio 中的预览效果图 和 运行效果图

这时发现我们我们替换的 TextView 自动就变成了Header,只是它还不会动。要动起来?那么太简单啦,网上随便一搜索就一大堆的 gif 。如这里:拖拖拖 ~~垃机C4D,类似的我们还可以找到很多,又如:环游东京30天:GIF版旅行指南

那我们就选择 环游东京30天:GIF版旅行指南 中的这张:

接着我们来改代码:

compile 'pl.droidsonroids.gif:android-gif-drawable:1.2.3'//一个开源gif控件
    <SmartRefreshLayout><pl.droidsonroids.gif.GifImageView
            android:layout_width="match_parent"android:layout_height="150dp"android:scaleType="centerCrop"android:src="@mipmap/gif_header_repast"/><ListView/><ClassicsFooter/></SmartRefreshLayout>

在 Android Studio 中的预览效果图 和 运行效果图

哈哈!一行Java代码都不用写,就完成了一个自定义的Header

嵌套Layout作为内容

如果boos要求在列表的前面固定一个广告条怎么办?这好办呀,一般我们会开开心心的下下这样的代码:

<LinearLayout
    android:orientation="vertical"><TextView
        android:layout_width="match_parent"android:layout_height="100dp"android:gravity="center"android:text="我就是boos要求加上的广告条啦"/><SmartRefreshLayout><ListView/></SmartRefreshLayout>
</LinearLayout>

但是在运行下拉刷新的时候,我们发现 Header是在广告条之下的,看着会别扭~,其实我们可以试试另一种方式,把广告条写到 RefreshLayout内部,看看会发生什么?

<SmartRefreshLayout><LinearLayout
        android:orientation="vertical"><TextView
            android:layout_width="match_parent"android:layout_height="100dp"android:gravity="center"android:text="我就是boos要求加上的广告条啦"/><ListView/></LinearLayout>
</SmartRefreshLayout>

由于伪代码过于简单,而且运行效果过于丑陋,这里还是贴出在实际项目中的实际情况吧~

我们注意看右边的图,仔细观察手指触摸的位置和下拉效果。可以看到在列表已经滚动到中部时,轻微下拉列表是不会触发刷新的,但是如果是触摸固定的布局,则可以触发下拉。从这里可以看出 SmartRefreshLayout 对滚动边界的判断是动态的,智能的!当然如果 SmartRefreshLayout 的智能还是不能满足你,可以通过 setListener 自己实现滚动边界的判断,更为准确!

功能

简单的介绍了两大特点框架和智能,接下来也说说SmartRefreshLayout还具有的其他常用功能吧~

  • 支持所有的 View(AbsListView、RecyclerView、WebView….View) 和多层嵌套的 Layout
  • 支持自定义并且已经集成了很多炫酷的 Header 和 Footer
  • 支持和ListView的同步滚动 和 RecyclerView、AppBarLayout、CoordinatorLayout 的嵌套滚动 NestedScrolling.
  • 支持在Android Studio Xml 编辑器中预览 效果
  • 支持分别在 Default(默认)、Xml、JavaCode 等三个地方设置 Header 和 Footer.
  • 支持自动刷新、自动上拉加载(自动检测列表滚动到底部,而不用手动上拉).
  • 支持通用的刷新监听器 OnRefreshListener 和更详细的滚动监听 OnMultiPurposeListener.
  • 支持自定义回弹动画的插值器,实现各种炫酷的动画效果.
  • 支持设置主题来适配任何场景的App,不会出现炫酷但很尴尬的情况.
  • 支持设置多种滑动方式来适配各种效果的Header和Footer:位置平移、尺寸拉伸、背后固定、顶层固定、全屏
  • 支持内容尺寸自适应 Content-wrap_content
  • 支持继承重写和扩展功能,内部实现没有 private 方法和字段,继承之后都可以重写覆盖
  • 支持越界回弹(Listview、RecyclerView、ScrollView、WebView…View)

使用

简单用例

1.在 buld.gradle 中添加依赖

compile 'com.android.support:appcompat-v7:25.3.1'//版本随意
compile 'com.scwang.smartrefresh:SmartRefreshLayout:1.0.4'
compile 'com.scwang.smartrefresh:SmartRefreshHeader:1.0.4'//没有使用特殊Header,可以不加这行

2.在XML布局文件中添加 SmartRefreshLayout

<?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.RecyclerView
        android:id="@+id/recyclerview"android:layout_width="match_parent"android:layout_height="match_parent"android:overScrollMode="never"android:background="#fff" />
</com.scwang.smartrefresh.layout.SmartRefreshLayout>

3.在 Activity 或者 Fragment 中添加代码

RefreshLayout refreshLayout = (RefreshLayout)findViewById(R.id.refreshLayout);
refreshLayout.setOnRefreshListener(new OnRefreshListener() {@Overridepublic void onRefresh(RefreshLayout refreshlayout) {refreshlayout.finishRefresh(2000);}
});
refreshLayout.setOnLoadmoreListener(new OnLoadmoreListener() {@Overridepublic void onLoadmore(RefreshLayout refreshlayout) {refreshlayout.finishLoadmore(2000);}
});

使用指定的 Header 和 Footer

1.方法一 全局设置

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).setSpinnerStyle(SpinnerStyle.Translate);//指定为经典Header,默认是 贝塞尔雷达Header}});//设置全局的Footer构建器SmartRefreshLayout.setDefaultRefreshFooterCreater(new DefaultRefreshFooterCreater() {@Overridepublic RefreshFooter createRefreshFooter(Context context, RefreshLayout layout) {//指定为经典Footer,默认是 BallPulseFooterreturn new ClassicsFooter(context).setSpinnerStyle(SpinnerStyle.Translate);}});}
}

注意:方法一 设置的Header和Footer的优先级是最低的,如果同时还使用了方法二、三,将会被其他方法取代

2.方法二 XML布局文件指定

    <com.scwang.smartrefresh.layout.SmartRefreshLayout
        xmlns:app="http://schemas.android.com/apk/res-auto"android:id="@+id/smartLayout"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.ClassicsHeader
            android:layout_width="match_parent"android:layout_height="wrap_content"/><TextView
            android:layout_width="match_parent"android:layout_height="match_parent"android:padding="@dimen/padding_common"android:background="@android:color/white"android:text="@string/description_define_in_xml"/><com.scwang.smartrefresh.layout.footer.ClassicsFooter
            android:layout_width="match_parent"android:layout_height="wrap_content"/></com.scwang.smartrefresh.layout.SmartRefreshLayout>

注意:方法二 XML设置的Header和Footer的优先级是中等的,会被方法三覆盖。而且使用本方法的时候,Android Studio 会有预览效果,如下图:

不过不用担心,只是预览效果,运行的时候只有下拉才会出现~

3.方法三 Java代码设置

final RefreshLayout refreshLayout = (RefreshLayout) findViewById(R.id.smartLayout);
//设置 Header 为 Material风格
refreshLayout.setRefreshHeader(new MaterialHeader(this).setShowBezierWave(true));
//设置 Footer 为 球脉冲
refreshLayout.setRefreshFooter(new BallPulseFooter(this).setSpinnerStyle(SpinnerStyle.Scale));

Android智能下拉刷新框架-SmartRefreshLayout相关推荐

  1. 【Android】下拉刷新上拉加载更多组件记录(81/100)

    Android智能下拉刷新框架-SmartRefreshLayout SmartRefreshLayout以打造一个强大,稳定,成熟的下拉刷新框架为目标,并集成各种的炫酷.多样.实用.美观的Heade ...

  2. Android 智能上拉加载下拉刷新框架之SmartRefreshLayout

    1.说明: SmartRefreshLayout的目标是打造一个强大,稳定,成熟的下拉刷新框架,并集成各种的炫酷.多样.实用.美观的Header和Footer.它不只是支持所有的View,还支持多层嵌 ...

  3. Android--智能下拉刷新框架(SmartRefreshLayout)

    SmartRefreshLayout是一个"聪明"或者"智能"的下拉刷新布局,由于它的"智能",它不只是支持所有的View,还支持多层嵌套的 ...

  4. android listview下拉刷新动画,android 安卓 listview 支持下拉刷新 上拉加载更多

    [1]重写listViewimport java.text.SimpleDateFormat; import java.util.Date; import com.example.testdddlea ...

  5. android 美团下拉刷新,美团外卖下拉刷新效果实现方法

    美团外卖下拉刷新效果实现方法,我们的下拉刷新的效果是在android-Ultra-Pull-To-Refresh框架上做的扩展,这是一款非常强大的下拉刷新框架,有着默认的下拉刷新动画,当然如果我们要实 ...

  6. Xamarin. Android实现下拉刷新功能

    PS:发现文章被其他网站或者博客抓取后发表为原创了,给图片加了个水印 下拉刷新功能在安卓和iOS中非常常见,一般实现这样的功能都是直接使用第三方的库,网上能找到很多这样的开源库.然而在Xamarin. ...

  7. Android 下拉刷新框架实现

    前段时间项目中用到了下拉刷新功能,之前在网上也找到过类似的demo,但这些demo的质量参差不齐,用户体验也不好,接口设计也不行.最张没办法,终于忍不了了,自己就写了一个下拉刷新的框架,这个框架是一个 ...

  8. android listview下拉刷新动画,ListView下拉刷新实现方式详解和改造(上)

    我们知道页面的下拉刷新目前基本已经成为智能移动终端的标配刷新方式.Twitter设计出现有的下拉刷新(在2013年申请了专利). 下拉刷新1.jpg 这一优美而又简单的刷新方式,很快使得各大系统纷纷效 ...

  9. Android 解决下拉刷新控件和ScrollVIew的滑动冲突问题。

    最近项目要实现ScrollView中嵌套广告轮播图+RecyleView卡片布局,并且RecyleView按照header和内容的排列样式,因为RecyleView的可扩展性很强,所以我毫无疑问的选择 ...

最新文章

  1. 通知 | 首届中国心电智能大赛复赛开启
  2. 阿里云发布勒索病毒专杀工具:一键修复 彻底查杀
  3. cuda版本的word2vec
  4. 在URL参数中传递复杂对象
  5. 检测网络是否稳定的计算机命令,如何查看自己的网络是否稳定
  6. 利用 python 的 http.server 包快速搭建web server 服务
  7. 使用ExchangeRate-API查询免费可用的汇率数据
  8. 6阶群的非平凡子群_抽代杂谈(9): Fratinni子群和幂零群(上)
  9. 分布式配置管理平台XXL-CONF
  10. 必读论文|20篇聊天机器人领域必读论文速递
  11. python自动填表单_用python-webdriver实现自动填表
  12. 背后实力大比拼 探秘七大IT巨头实验室
  13. 怎么解除计算机管理员的身份,怎么取消管理员权限(怎么取消管理员取得所有权)...
  14. 【AAAA级LED护眼学习台灯照明方案】PWM内部转模拟,调光深度1%,无频闪顾虑,低亮无抖动LED恒流驱动芯片FP7102/FP7103/FP7208/FP7209
  15. 淘宝/天猫买家信息 API 返回值说明
  16. IBM 开源图形终端Kui框架
  17. [dlang](4)自定义的mysql orm工具
  18. 赛扬n5095处理器怎么样 英特尔n5095核显相当于什么水平
  19. MacTeX的使用心得
  20. 【uniapp前端组件】仿微信通讯录列表组件

热门文章

  1. 同余方程 ax≡1(mod b) POJ 1061 青蛙的约会
  2. 购买货为计算机产品 这个账,华为matebook x pro的流水账全主观评测
  3. linux 安装不了高版本内核,Parallel Tools 高版本内核的安装失败的解决方法 | 国光...
  4. nvue引入字体图标
  5. Vue--vant-cell单元格组件跳转路由的三种方式
  6. 人力资源后端项目_03-Mybatis-Plus之代码生成器
  7. django-web系统模板
  8. 【每日早报】2019/09/24
  9. 在pygame中实现菜单,支持鼠标和键盘操作
  10. 制作随身携带的Kali linux,将kali装入U盘