Skip to content

Latest commit

History

History
389 lines (338 loc) · 22 KB

File metadata and controls

389 lines (338 loc) · 22 KB

SmoothRefreshLayout

English | 中文

一个高效的Android刷新库,理论上支持所有的视图,比官方的SwipeRefreshLayout更强大且使用方便.
本开源库的部分代码来自android-Ultra-Pull-To-Refresh.
非常感谢他提供的这么棒的开源项目!

特性:

  • 理论上支持所有的视图,且可根据具体需求高效适配.
  • 支持嵌套滑动,完整实现了NestedScrollingChild,NestedScrollingParent 接口,玩转CoordinatorLayout.
  • 直接继承自ViewGroup,拥有卓越的性能,支持类FameLayout的特性(Gravity、Margin).
  • 支持自动刷新、自动上拉加载、到底自动加载更多(不推荐,建议使用Adapter实现,可自定义到底判断逻辑回调实现预加载更多).
  • 支持越界回弹.
  • 支持抽屉效果(即刷新视图固定在内容视图下方).
  • 支持刷新视图自定样式,STYLE_DEFAULT(默认不改变大小)、STYLE_SCALE(动态改变大小)
  • 支持二级刷新事件(TwoLevelSmoothRefreshLayout),PS:淘宝二楼、京东活动.
  • 支持ListView,GridView,RecyclerView加载更多的平滑滚动.
  • 支持内容视图的Margin,PS:滚动中没有了Margin效果?SmoothRefreshLayout不存在这种问题.
  • 支持多状态视图,STATE_CONTENT(默认状态)、STATE_ERROR(异常状态),STATE_EMPTY(空状态),STATE_CUSTOM(自定义状态).
  • 丰富的回调接口和调试信息,可利用现有Api实现丰富的效果.

演示程序

下载 Demo.apk

更新日志

老版本升级务必查看

更新日志

快照

  • 测试QQ浏览器样式

  • 测试QQ活动样式

  • 测试2级刷新

  • 包含FrameLayout

  • 包含TextView

  • 包含ListView

  • 包含GridView

  • 包含RecyclerView

  • 包含ViewPager

  • 包含WebView

  • CoordinatorLayout

  • 越界回弹模式

  • 测试嵌套滑动

使用

Gradle

repositories { ...
maven { url 'https://jitpack.io' } }
dependencies { compile 'com.github.dkzwm:SmoothRefreshLayout:1.4.5'
}

在Xml中配置

自v1.4.1版本后
<?xml version="1.0" encoding="utf-8"?>
<me.dkzwm.widget.srl.SmoothRefreshLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/smoothRefreshLayout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</me.dkzwm.widget.srl.SmoothRefreshLayout>
v1.4.1之前的版本
<?xml version="1.0" encoding="utf-8"?>
<me.dkzwm.smoothrefreshlayout.SmoothRefreshLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/smoothRefreshLayout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</me.dkzwm.smoothrefreshlayout.SmoothRefreshLayout>

Java代码配置

SmoothRefreshLayout refreshLayout = (SmoothRefreshLayout)findViewById(R.id.smoothRefreshLayout);
refreshLayout.setMode(SmoothRefreshLayout.MODE_BOTH);
refreshLayout.setHeaderView(new ClassicHeader(this));
refreshLayout.setOnRefreshListener(new RefreshingListenerAdapter() {
@Override
public void onRefreshBegin(boolean isRefresh) {
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
refreshLayout.refreshComplete();
}
}, 4000);
}
});

自定义刷新视图

接口定义
public interface IRefreshView { byte TYPE_HEADER = 0;
byte TYPE_FOOTER = 1;
byte STYLE_DEFAULT = 0;
byte STYLE_SCALE = 1;
/**
* 返回是头部视图还是尾部视图
*/
int getType();
/**
* 一般情况都是View实现本接口,所以返回this;
*/
View getView();
/**
* 获取视图样式,现支持2种样式,默认样式和缩放样式。
*/
int getStyle();
/**
* 获取视图的自定义高度,当视图样式为STYLE_SCALE时,必须返回一个确切且大于0的值
*/
int getCustomHeight();
/**
* 手指离开屏幕
*/
void onFingerUp(SmoothRefreshLayout layout, IIndicator indicator);
/**
* 重置视图
*/
void onReset(SmoothRefreshLayout layout);
/**
* 重新配置视图,准备刷新
*/
void onRefreshPrepare(SmoothRefreshLayout layout);
/**
* 开始刷新
*/
void onRefreshBegin(SmoothRefreshLayout layout, IIndicator indicator);
/**
* 刷新完成
*/
void onRefreshComplete(SmoothRefreshLayout layout,boolean isSuccessful);
/**
* 当头部或者尾部视图发生位置变化
*/
void onRefreshPositionChanged(SmoothRefreshLayout layout, byte status, IIndicator indicator);
}
添加自定义刷新视图
  • 全局静态代码构造

SmoothRefreshLayout.setDefaultCreator(new IRefreshViewCreator() {
@Override
public void createHeader(SmoothRefreshLayout layout) {
ClassicHeader header = new ClassicHeader(layout.getContext());
layout.setHeaderView(header);
}
@Override
public void createFooter(SmoothRefreshLayout layout) {
ClassicFooter footer = new ClassicFooter(layout.getContext());
layout.setFooterView(footer);
}
});
  • 动态代码添加

setHeaderView(@NonNull IRefreshView header);
setFooterView(@NonNull IRefreshView footer);
  • 请直接写入Xml文件,SmoothRefreshLayout会根据添加的View是否是实现了IRefreshView接口进行判断

Xml属性

SmoothRefreshLayout 自身配置
名称类型描述
sr_contentreference指定内容视图的资源ID
sr_resistancefloat移动刷新视图时候的移动阻尼(默认:1.65f
sr_resistance_of_footerfloat移动Footer视图时候的移动阻尼(默认:1.65f
sr_resistance_of_headerfloat移动Header视图时候的移动阻尼(默认:1.65f
sr_ratio_of_refresh_height_to_refreshfloat触发刷新时位置占刷新视图的高度比(默认:1.1f
sr_ratio_of_header_height_to_refreshfloat触发刷新时位置占Header视图的高度比(默认:1.1f
sr_ratio_of_footer_height_to_refreshfloat触发加载更多时位置占Footer视图的高度比(默认:1.1f
sr_offset_ratio_to_keep_refresh_while_Loadingfloat刷新中保持视图位置占刷新视图的高度比(默认:1f),该属性的值必须小于等于触发刷新高度比才会有效果
sr_offset_ratio_to_keep_header_while_Loadingfloat刷新中保持视图位置占Header视图的高度比(默认:1f),该属性的值必须小于等于触发刷新高度比才会有效果
sr_offset_ratio_to_keep_footer_while_Loadingfloat刷新中保持视图位置占Footer视图的高度比(默认:1f),该属性的值必须小于等于触发刷新高度比才会有效果
sr_can_move_the_max_ratio_of_refresh_heightfloat最大移动距离占刷新视图的高度比(默认:0f,表示不会触发)
sr_can_move_the_max_ratio_of_header_heightfloat最大移动距离占Header视图的高度比(默认:0f,表示不会触发)
sr_can_move_the_max_ratio_of_footer_heightfloat最大移动距离占Footer视图的高度比(默认:0f,表示不会触发)
sr_duration_to_close_of_refreshinteger指定收缩刷新视图到起始位置的时长(默认:500
sr_duration_to_close_of_headerinteger指定收缩Header视图到起始位置的时长(默认:500
sr_duration_to_close_of_footerinteger指定收缩Footer视图到起始位置的时长(默认:500
sr_duration_of_back_to_keep_refresh_posinteger设置回滚到保持刷新视图位置的时间(默认:200
sr_duration_of_back_to_keep_header_posinteger设置回滚到保持Header视图位置的时间(默认:200
sr_duration_of_back_to_keep_header_posinteger设置回滚到保持Footer视图位置的时间(默认:200
sr_enable_pin_contentboolean固定内容视图(默认:false
sr_enable_keep_refresh_viewboolean刷新中保持视图停留在所设置的应该停留的位置(默认:true
sr_enable_pull_to_refreshboolean拉动刷新,下拉或者上拉到触发刷新位置即立即触发刷新(默认:false
sr_enable_over_scrollboolean越界回弹(默认:true),使用者需要自己设置内容视图的 overScrollModenever 才能达到最优效果
sr_empty_layoutreference指定空状态下对应的布局资源ID
sr_error_layoutreference指定异常状态下对应的布局资源ID
sr_custom_layoutreference指定自定义状态下对应的布局资源ID
sr_stateenum状态设置 (默认:STATE_CONTENT
sr_enable_refreshboolean设置是否启用下拉刷新(默认:ture
sr_enable_load_moreboolean设置是否启用加载更多(默认:false
TwoLevelSmoothRefreshLayout 自身配置
v1.4.5之后的版本
名称类型描述
sr_enable_two_level_refreshboolean设置是否启用二级刷新(默认:true
v1.4.5之前的版本
名称类型描述
sr_enable_two_level_pull_to_refreshboolean设置是否启用二级刷新(默认:true
SmoothRefreshLayout包裹内部其他View支持配置
名称类型描述
layout_gravityflag指定其它被包裹视图的对齐属性(非 targetView、非refreshView)

SmoothRefreshLayout java属性设置方法

名称参数描述
setHeaderViewIRefreshView配置头部视图
setFooterViewIRefreshView配置尾部视图
setContentViewint,View配置内容视图,参数1:设置内容视图对应的状态,参数2:状态对应的内容视图
setStateint配置当前状态
setStateint,boolean配置当前状态,参数1:当前状态,参数2:是否使用渐变动画过渡
setDisableWhenHorizontalMoveboolean内部视图含有横向滑动视图(例如ViewPager)时需设置该属性为ture(默认:false
setEnableNextPtrAtOnceboolean刷新完成即可再次刷新
setOverScrollDurationRatiofloat越界回弹时间比,当触发越界时得到的移动时长乘以该比例得到真实移动时长,该时长最大不超过mMaxOverScrollDuration的值(默认:0.5f).
setMaxOverScrollDurationint设置越界回弹动画最长时间(默认:500
setMinOverScrollDurationint设置越界回弹动画最短时间(默认:150
setResistancefloat移动刷新视图时候的移动阻尼(默认:1.65f
setResistanceOfFooterfloat移动Footer视图时候的移动阻尼(默认:1.65f
setResistanceOfHeaderfloat移动Header视图时候的移动阻尼(默认:1.65f
setRatioOfRefreshViewHeightToRefreshfloat触发刷新时位置占刷新视图的高度比(默认:1.1f
setRatioOfHeaderHeightToRefreshfloat触发刷新时位置占Header视图的高度比(默认:1.1f
setRatioOfFooterHeightToRefreshfloat触发加载更多时位置占Footer视图的高度比(默认:1.1f
setOffsetRatioToKeepRefreshViewWhileLoadingfloat刷新中保持视图位置占刷新视图的高度比(默认:1f),该属性的值必须小于等于触发刷新高度比才会有效果
setOffsetRatioToKeepHeaderWhileLoadingfloat刷新中保持视图位置占Header视图的高度比(默认:1f),该属性的值必须小于等于触发刷新高度比才会有效果
setOffsetRatioToKeepFooterWhileLoadingfloat刷新中保持视图位置占Footer视图的高度比(默认:1f),该属性的值必须小于等于触发刷新高度比才会有效果
setCanMoveTheMaxRatioOfRefreshViewHeightfloat最大移动距离占刷新视图的高度比(默认:0f,表示不会触发)
setCanMoveTheMaxRatioOfHeaderHeightfloat最大移动距离占Header视图的高度比(默认:0f,表示不会触发)
setCanMoveTheMaxRatioOfFooterHeightfloat最大移动距离占Footer视图的高度比(默认:0f,表示不会触发)
setDurationToCloseint指定收缩刷新视图到起始位置的时长(默认:500
setDurationToCloseHeaderint指定收缩Header视图到起始位置的时长(默认:500
setDurationToCloseFooterint指定收缩Footer视图到起始位置的时长(默认:500
setDurationOfBackToKeepRefreshViewPositioninteger设置回滚到保持刷新视图位置的时间(默认:200
setDurationOfBackToKeepHeaderPositioninteger设置回滚到保持Header视图位置的时间(默认:200
setDurationOfBackToKeepFooterPositioninteger设置回滚到保持Footer视图位置的时间(默认:200
setEnablePinContentViewboolean固定内容视图(默认:false
setEnabledPullToRefreshboolean拉动刷新,下拉或者上拉到触发刷新位置即立即触发刷新(默认:false
setEnableOverScrollboolean越界回弹(默认:true),使用者需要自己设置内容视图的 overScrollModenever 才能达到最优效果
setEnabledInterceptEventWhileLoadingboolean刷新中拦截不响应触摸操作(默认:false
setEnableHeaderDrawerStylebooleanHeader抽屉样式,即Header视图在内容视图下面(默认:false
setEnableFooterDrawerStylebooleanFooter抽屉样式,即Footer视图在内容视图下面(默认:false
setDisablePerformRefreshboolean关闭触发Header刷新(默认:false
setDisablePerformLoadMoreboolean关闭触发Footer刷新(默认:false
setEnableLoadMoreNoMoreDataboolean设置Footer没有更多数据,该选项设置true时在Frame层等同setDisablePerformLoadMore设置为true,只是自定义视图可以根据该标志位改变视图样式,ClassicFooter默认实现了对该属性的支持(默认:false
setDisableRefreshboolean禁用Header刷新(默认:false
setDisableLoadMoreboolean禁用Footer刷新(默认:false
setEnableKeepRefreshViewboolean刷新中保持视图停留在所设置的应该停留的位置(默认:true
setEnableScrollToBottomAutoLoadMoreboolean到底部自动加载(默认:false
setEnablePinRefreshViewWhileLoadingboolean固定刷新视图在所设置的应该停留的位置,并且不响应移动,即Material样式(默认:false),设置前提是开启了setEnablePinContentViewsetEnableKeepRefreshView2个选项,否则运行时会抛出异常

SmoothRefreshLayout 回调

名称参数描述
setOnRefreshListenerT extends OnRefreshListener设置刷新事件监听回调
setOnStateChangedListenerOnStateChangedListener设置状态改变回调
addOnUIPositionChangedListenerOnUIPositionChangedListener添加视图位置变化的监听回调
removeOnUIPositionChangedListenerOnUIPositionChangedListener移除视图位置变化的监听回调
setOnLoadMoreScrollCallbackOnLoadMoreScrollCallback设置Footer完成刷新后进行平滑滚动的回调
setOnPerformAutoLoadMoreCallBackOnPerformAutoLoadMoreCallBack设置触发自动加载更多的条件回调,如果回调的canAutoLoadMore()方法返回true则会立即触发加载更多
setOnChildScrollUpCallbackOnChildScrollUpCallback设置检查内容视图是否在顶部的回调(SmoothRefreshLayout内部canChildScrollUp()方法)
setOnChildScrollDownCallbackOnChildScrollDownCallback设置检查内容视图是否在底部的回调(SmoothRefreshLayout内部canChildScrollDown()方法)
setOnHookHeaderRefreshCompleteCallbackOnHookUIRefreshCompleteCallBack设置Header刷新完成的Hook回调,可实现延迟完成刷新
setOnHookFooterRefreshCompleteCallbackOnHookUIRefreshCompleteCallBack设置Footer刷新完成的Hook回调,可实现延迟完成刷新

SmoothRefreshLayout 其它

名称参数描述
debug(静态方法)booleanDebug开关
setDefaultCreator(静态方法)IRefreshViewCreator设置刷新视图创建者,如果没有特殊指定刷新视图且设置的模式需要刷新视图则会调用创建者构建刷新视图
refreshComplete无参刷新完成,且设置最后一次刷新状态为成功
refreshCompleteboolean刷新完成,参数:设置最后一次刷新是否刷新成功
refreshCompleteboolean,long刷新完成,参数1:设置最后一次刷新是否刷新成功,参数2:设置延迟重置刷新状态的时间(会先触发刷新视图的刷新完成回调,但在延迟的时间内库实际上状态仍是刷新状态)
refreshCompletelong刷新完成,且设置最后一次刷新状态为成功,参数:设置延迟重置刷新状态的时间(会先触发刷新视图的刷新完成回调,但在延迟的时间内库实际上状态仍是刷新状态)
setLoadingMinTimelong设置开始刷新到结束刷新的最小时间差(默认:500),参数:时间差
autoRefresh无参自动触发Header刷新,立即触发刷新事件并滚动到触发Header刷新位置
autoRefreshboolean自动触发Header刷新,参数:是否立即触发刷新事件,会滚动到触发Header刷新位置
autoRefreshboolean,boolean自动触发Header刷新,参数1:是否立即触发刷新事件,参数2:是否滚动到触发Header刷新位置
autoLoadMore无参自动触发Footer刷新,立即触发刷新事件并滚动到触发Footer刷新位置
autoLoadMoreboolean自动触发Footer刷新,参数:是否立即触发刷新事件,会滚动到触发Footer刷新位置
autoLoadMoreboolean,boolean自动触发Footer刷新,参数1:是否立即触发刷新事件,参数2:是否滚动到触发Footer刷新位置
setLoadMoreScrollTargetViewView设置Footer移动时,响应移动事件的内容视图,例如在SmoothRefreshLayout中有一个CoordinatorLayout,CoordinatorLayout中有AppbarLayout、RecyclerView等,加载更多时希望被移动的视图为RecyclerView而不是CoordinatorLayout,那么设置RecyclerView为TargetView即可

TwoLevelSmoothRefreshLayout java属性设置方法

名称参数描述
setRatioOfHeaderHeightToHintTwoLevelRefreshfloat设置触发二级刷新提示时的位置占Header视图的高度比
setRatioOfHeaderHeightToTwoLevelRefreshfloat设置触发二级刷新时的位置占Header视图的高度比
setOffsetRatioToKeepTwoLevelHeaderWhileLoadingfloat二级刷新中保持视图位置占Header视图的高度比(默认:1f
setDisableTwoLevelRefreshboolean设置是否关闭二级刷新(默认:false
setDurationOfBackToKeepTwoLevelHeaderViewPositionint设置回滚到保持二级刷新Header视图位置的时间(默认:500
setDurationToCloseTwoLevelHeaderint设置二级刷新Header刷新完成回滚到起始位置的时间(默认:500

TwoLevelSmoothRefreshLayout 其它

名称参数描述
autoTwoLevelRefreshHint无参自动触发二级刷新提示并滚动到触发提示位置后回滚回起始位置
autoTwoLevelRefreshHintint自动触发二级刷新提示并滚动到触发提示位置后停留指定时长,参数:停留多长时间
autoTwoLevelRefreshHintboolean自动触发二级刷新提示是否滚动到触发提示位置后回滚回起始位置,参数:是否滚到到触发位置
autoTwoLevelRefreshHintboolean,int自动触发二级刷新提示,参数1:是否滚动到触发位置,参数2:停留多长时间

Thanks

License

MIT License
Copyright (c) 2017 dkzwm
Copyright (c) 2015 liaohuqiu.net
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.