代码拉取完成,页面将自动刷新
同步操作将从 dkzwm/SmoothRefreshLayout 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
一个高效的Android刷新库,理论上支持所有的视图,比官方的SwipeRefreshLayout更强大且使用方便.
本开源库的部分代码来自android-Ultra-Pull-To-Refresh.
非常感谢他提供的这么棒的开源项目!
下载 Demo.apk
测试拉伸收缩效果(1.6.2版本添加)
测试横向拉伸收缩效果(1.6.2版本添加)
测试横向刷新(1.5.0版本添加)
测试横向RecyclerView刷新(1.5.0版本添加)
测试多方向布局下的刷新
测试QQ浏览器样式
测试QQ活动样式
测试2级刷新
包含ListView
包含GridView
包含RecyclerView
包含ViewPager
CoordinatorLayout
越界回弹模式
测试嵌套滑动
dependencies {
implementation 'me.dkzwm.widget.srl:core:1.6.5'
//由于误操作删除了原有的仓库,请注意新名字少了个's'
implementation 'me.dkzwm.widget.srl:ext-util:1.6.5'
implementation 'me.dkzwm.widget.srl:ext-material:1.6.5'
implementation 'me.dkzwm.widget.srl:ext-horizontal:1.6.5'
//由于误操作删除了原有的仓库,请注意新名字多了个's'
implementation 'me.dkzwm.widget.srl:ext-classics:1.6.5'
implementation 'me.dkzwm.widget.srl:ext-two-level:1.6.5'
//androidX版本
implementation 'me.dkzwm.widget.srl:core:1.6.5.androidx'
implementation 'me.dkzwm.widget.srl:ext-util:1.6.5.androidx'
implementation 'me.dkzwm.widget.srl:ext-material:1.6.5.androidx'
implementation 'me.dkzwm.widget.srl:ext-horizontal:1.6.5.androidx'
implementation 'me.dkzwm.widget.srl:ext-classics:1.6.5.androidx'
implementation 'me.dkzwm.widget.srl:ext-two-level:1.6.5.androidx'
}
<?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/refreshLayout"
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>
SmoothRefreshLayout refreshLayout = (SmoothRefreshLayout)findViewById(R.id.smoothRefreshLayout);
refreshLayout.setHeaderView(new ClassicHeader(this));
refreshLayout.setOnRefreshListener(new RefreshingListenerAdapter() {
@Override
public void onRefreshing() {
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
refreshLayout.refreshComplete();
}
}, 4000);
}
});
public interface IRefreshView <T extends IIndicator> {
byte TYPE_HEADER = 0;
byte TYPE_FOOTER = 1;
byte STYLE_DEFAULT = 0;
byte STYLE_SCALE = 1;
byte STYLE_PIN = 2;
byte STYLE_FOLLOW_SCALE = 3;
byte STYLE_FOLLOW_PIN = 4;
byte STYLE_FOLLOW_CENTER = 5;
/**
* 返回是头部视图还是尾部视图;
*/
int getType();
/**
* 一般情况都是View实现本接口,所以返回this;
*/
View getView();
/**
* 获取视图样式,自1.4.8版本后支持6种样式,STYLE_DEFAULT、STYLE_SCALE、STYLE_PIN、STYLE_FOLLOW_SCALE、STYLE_FOLLOW_PIN、STYLE_FOLLOW_CENTER;
*/
int getStyle();
/**
* 获取视图的自定义高度,当视图样式为STYLE_SCALE和STYLE_FOLLOW_SCALE时,必须返回一个确切且大于0的值,使用横向刷新库时,该属性实际应该返回的是视图的宽度;
* 自1.6.1版本开始,如果想要当前视图铺满布局即MATCH_PARENT,那么支持返回ViewGroup.LayoutParams.MATCH_PARENT对应的值即`-1`;
*/
int getCustomHeight();
/**
* 手指离开屏幕;
*/
void onFingerUp(SmoothRefreshLayout layout, T indicator);
/**
* 重置视图;
*/
void onReset(SmoothRefreshLayout layout);
/**
* 重新配置视图,准备刷新;
*/
void onRefreshPrepare(SmoothRefreshLayout layout);
/**
* 开始刷新;
*/
void onRefreshBegin(SmoothRefreshLayout layout, T indicator);
/**
* 刷新完成;
*/
void onRefreshComplete(SmoothRefreshLayout layout,boolean isSuccessful);
/**
* 当头部或者尾部视图发生位置变化;
*/
void onRefreshPositionChanged(SmoothRefreshLayout layout, byte status, T indicator);
/**
* 当头部或者尾部视图仍然处于处理事务中,这时候移动其他刷新视图则会调用该方法;
* 在1.4.6版本新加入;
*/
void onPureScrollPositionChanged(SmoothRefreshLayout layout, byte status, T indicator);
}
SmoothRefreshLayout.setDefaultCreator(new IRefreshViewCreator() {
@Override
public IRefreshView<IIndicator> createHeader(SmoothRefreshLayout layout) {
ClassicHeader header = new ClassicHeader(layout.getContext());
return header;
}
@Override
public IRefreshView<IIndicator> createFooter(SmoothRefreshLayout layout) {
ClassicFooter footer = new ClassicFooter(layout.getContext());
return footer;
}
});
ClassicHeader header = new ClassicHeader(mRefreshLayout.getContext());
mRefreshLayout.setHeaderView(header);
ClassicFooter footer = new ClassicFooter(mRefreshLayout.getContext());
mRefreshLayout.setFooterView(footer);
mRefreshLayout.setIndicatorOffsetCalculator(new IIndicator.IOffsetCalculator() {
@Override
public float calculate(@IIndicator.MovingStatus int status, int currentPos, float offset) {
if (status == IIndicator.MOVING_HEADER) {
if (offset < 0) {
//如果希望拖动缩回时类似QQ一样没有阻尼效果,阻尼效果只存在于下拉则可以在此返回offset
//如果希望拖动缩回时类似QQ一样有阻尼效果,那么请注释掉这个判断语句
return offset;
}
return (float) Math.pow(Math.pow(currentPos / 2, 1.28d) + offset, 1 / 1.28d) * 2 - currentPos;
} else if (status == IIndicator.MOVING_FOOTER) {
if (offset > 0) {
//如果希望拖动缩回时类似QQ一样没有阻尼效果,阻尼效果只存在于上拉则可以在此返回offset
//如果希望拖动缩回时类似QQ一样有阻尼效果,那么请注释掉这个判断语句
return offset;
}
return -((float) Math.pow(Math.pow(currentPos / 2, 1.28d) - offset, 1 / 1.28d) * 2 - currentPos);
} else {
if (offset > 0) {
return (float) Math.pow(offset, 1 / 1.28d) * 2;
} else if (offset < 0) {
return -(float) Math.pow(-offset, 1 / 1.28d) * 2;
} else {
return offset;
}
}
}
});
名称 | 类型 | 描述 |
---|---|---|
sr_content | reference | 指定内容视图的资源ID |
sr_resistance | float | 移动刷新视图时候的移动阻尼(默认:1.65f ) |
sr_resistanceOfFooter | float | 移动Footer视图时候的移动阻尼(默认:1.65f ) |
sr_resistanceOfHeader | float | 移动Header视图时候的移动阻尼(默认:1.65f ) |
sr_ratioToRefresh | float | 触发刷新时位置占刷新视图的高度比(默认:1f ) |
sr_ratioOfHeaderToRefresh | float | 触发刷新时位置占Header视图的高度比(默认:1f ) |
sr_ratioOfFooterToRefresh | float | 触发加载更多时位置占Footer视图的高度比(默认:1f ) |
sr_ratioToKeep | float | 刷新中保持视图位置占刷新视图的高度比(默认:1f ),该属性的值必须小于等于触发刷新高度比才会有效果 |
sr_ratioToKeepHeader | float | 刷新中保持视图位置占Header视图的高度比(默认:1f ),该属性的值必须小于等于触发刷新高度比才会有效果 |
sr_ratioToKeepFooter | float | 刷新中保持视图位置占Footer视图的高度比(默认:1f ),该属性的值必须小于等于触发刷新高度比才会有效果 |
sr_maxMoveRatio | float | 最大移动距离占刷新视图的高度比(默认:0f ,表示不会触发) |
sr_maxMoveRatioOfHeader | float | 最大移动距离占Header视图的高度比(默认:0f ,表示不会触发) |
sr_maxMoveRatioOfFooter | float | 最大移动距离占Footer视图的高度比(默认:0f ,表示不会触发) |
sr_closeDuration | integer | 指定收缩刷新视图到起始位置的时长(默认:350 ) |
sr_closeHeaderDuration | integer | 指定收缩Header视图到起始位置的时长(默认:350 ) |
sr_closeFooterDuration | integer | 指定收缩Footer视图到起始位置的时长(默认:350 ) |
sr_backToKeepDuration | integer | 设置回滚到保持刷新视图位置的时间(默认:200 ) |
sr_backToKeepHeaderDuration | integer | 设置回滚到保持Header视图位置的时间(默认:200 ) |
sr_backToKeepFooterDuration | integer | 设置回滚到保持Footer视图位置的时间(默认:200 ) |
sr_enablePinContent | boolean | 固定内容视图(默认:false ) |
sr_enableKeep | boolean | 刷新中保持视图停留在所设置的应该停留的位置(默认:true ) |
sr_enablePullToRefresh | boolean | 拉动刷新,下拉或者上拉到触发刷新位置即立即触发刷新(默认:false ) |
sr_enableOverScroll | boolean | 越界回弹(默认:true ) |
sr_enableRefresh | boolean | 设置是否启用下拉刷新(默认:ture ) |
sr_enableLoadMore | boolean | 设置是否启用加载更多(默认:false ) |
sr_headerBackgroundColor | color | 设置Header刷新高度区域的背景色 |
sr_footerBackgroundColor | color | 设置Footer刷新高度区域的背景色 |
sr_mode | enum | 模式设置(默认:MODE_DEFAULT 为刷新控件模式) |
sr_stickyHeader | reference | 指定黏贴头部的资源ID |
sr_stickyFooter | reference | 指定黏贴尾部的资源ID |
名称 | 类型 | 描述 |
---|---|---|
sr_enableTwoLevelRefresh | boolean | 设置是否启用二级刷新(默认:true ) |
sr_backToKeep2Duration | boolean | 设置回滚到保持二级刷新头部处于二级刷新过程中的时长(默认:500 ) |
sr_closeHeader2Duration | boolean | 设置关闭二级刷新头部的时长(默认:500 ) |
名称 | 类型 | 描述 |
---|---|---|
layout_gravity | flag | 指定其它被包裹视图的对齐属性(非 targetView、非refreshView) |
名称 | 参数 | 描述 |
---|---|---|
setHeaderView | IRefreshView | 配置头部视图 |
setFooterView | IRefreshView | 配置尾部视图 |
setContentView | View | 配置内容视图 |
setMode | int | 配置当前模式 |
setDisableWhenAnotherDirectionMove | boolean | 内部视图含有其他方向滑动视图时需设置该属性为ture(默认:false ) |
setEnableNextPtrAtOnce | boolean | 刷新完成即可再次刷新 |
setMaxOverScrollDuration | int | 设置越界回弹动画最长时间(默认:350 ) |
setMinOverScrollDuration | int | 设置越界回弹动画最短时间(默认:100 ) |
setResistance | float | 移动刷新视图时候的移动阻尼(默认:1.65f ) |
setResistanceOfFooter | float | 移动Footer视图时候的移动阻尼(默认:1.65f ) |
setResistanceOfHeader | float | 移动Header视图时候的移动阻尼(默认:1.65f ) |
setRatioToRefresh | float | 触发刷新时位置占刷新视图的高度比(默认:1.1f ) |
setRatioOfHeaderToRefresh | float | 触发刷新时位置占Header视图的高度比(默认:1.1f ) |
setRatioOfFooterToRefresh | float | 触发加载更多时位置占Footer视图的高度比(默认:1.1f ) |
setRatioToKeep | float | 刷新中保持视图位置占刷新视图的高度比(默认:1f ),该属性的值必须小于等于触发刷新高度比才会有效果 |
setRatioToKeepHeader | float | 刷新中保持视图位置占Header视图的高度比(默认:1f ),该属性的值必须小于等于触发刷新高度比才会有效果 |
setRatioToKeepFooter | float | 刷新中保持视图位置占Footer视图的高度比(默认:1f ),该属性的值必须小于等于触发刷新高度比才会有效果 |
setMaxMoveRatio | float | 最大移动距离占刷新视图的高度比(默认:0f ,表示不会触发) |
setMaxMoveRatioOfHeader | float | 最大移动距离占Header视图的高度比(默认:0f ,表示不会触发) |
setMaxMoveRatioOfFooter | float | 最大移动距离占Footer视图的高度比(默认:0f ,表示不会触发) |
setDurationToClose | int | 指定收缩刷新视图到起始位置的时长(默认:350 ) |
setDurationToCloseHeader | int | 指定收缩Header视图到起始位置的时长(默认:350 ) |
setDurationToCloseFooter | int | 指定收缩Footer视图到起始位置的时长(默认:350 ) |
setDurationOfBackToKeep | integer | 设置回滚到保持刷新视图位置的时间(默认:200 ) |
setDurationOfBackToKeepHeader | integer | 设置回滚到保持Header视图位置的时间(默认:200 ) |
setDurationOfBackToKeepFooter | integer | 设置回滚到保持Footer视图位置的时间(默认:200 ) |
setEnablePinContentView | boolean | 固定内容视图(默认:false ) |
setEnablePullToRefresh | boolean | 拉动刷新,下拉或者上拉到触发刷新位置即立即触发刷新(默认:false ) |
setEnableOverScroll | boolean | 越界回弹(默认:true ) |
setEnableInterceptEventWhileLoading | boolean | 刷新中拦截不响应触摸操作(默认:false ) |
setEnableHeaderDrawerStyle | boolean | Header抽屉样式,即Header视图在内容视图下面(默认:false ) |
setEnableFooterDrawerStyle | boolean | Footer抽屉样式,即Footer视图在内容视图下面(默认:false ) |
setDisablePerformRefresh | boolean | 关闭触发Header刷新(默认:false ) |
setDisablePerformLoadMore | boolean | 关闭触发Footer刷新(默认:false ) |
setEnableNoMoreData | boolean | 设置Footer没有更多数据,该选项设置true 时在Frame层等同setDisablePerformLoadMore 设置为true ,只是自定义视图可以根据该标志位改变视图样式,ClassicFooter 默认实现了对该属性的支持(默认:false ) |
setEnableNoSpringBackWhenNoMoreData | boolean | 设置Footer没有更多数据情况下不再回弹 |
setDisableRefresh | boolean | 禁用Header刷新(默认:false ) |
setDisableLoadMore | boolean | 禁用Footer刷新(默认:false ) |
setEnableKeepRefreshView | boolean | 刷新中保持视图停留在所设置的应该停留的位置(默认:true ) |
setEnableAutoLoadMore | boolean | 到底部自动加载(默认:false ) |
setEnablePinRefreshViewWhileLoading | boolean | 固定刷新视图在所设置的应该停留的位置,并且不响应移动,即Material样式(默认:false ),设置前提是开启了setEnablePinContentView 和setEnableKeepRefreshView 2个选项,否则运行时会抛出异常 |
setSpringInterpolator | Interpolator | 设置主动弹出时的滚动插值器 |
setSpringBackInterpolator | Interpolator | 设置释放时的滚动插值器 |
setEnableCheckInsideAnotherDirectionView | boolean | 设置是否开启检查手指按下点是否位于其他方向滚动视图内,该属性起作用必须满足开启setDisableWhenAnotherDirectionMove
|
setEnableCompatLoadMoreScroll | boolean | 设置是否开启加载更多时的同步滚动(默认:true ) |
setHeaderBackgroundColor | int | 设置Header刷新高度区域的背景色,可用以替代在Header样式为不需要动态改变视图大小的情况下又想设置刷新高度区域的背景色的场景 |
setFooterBackgroundColor | int | 设置Footer刷新高度区域的背景色,可用以替代在Footer样式为不需要动态改变视图大小的情况下又想设置刷新高度区域的背景色的场景 |
setEnableSmoothRollbackWhenCompleted | boolean | 设置开启当刷新完成时,回滚动作不能被打断 |
setDisableLoadMoreWhenContentNotFull | boolean | 设置当内容视图未满屏时关闭加载更多 |
setStickyHeaderResId | int | 设置黏贴头部视图的资源ID |
setStickyFooterResId | int | 设置黏贴头部视图的资源ID |
setEnableDynamicEnsureTargetView | boolean | 设置开启动态搜索内容视图 |
setEnableOldTouchHandling | boolean | 设置启用老版本的触摸事件处理逻辑 |
setScrollTargetView | View | 设置判断是否滚到到边界对应的视图,例如在SmoothRefreshLayout中有一个CoordinatorLayout,CoordinatorLayout中有AppbarLayout、RecyclerView等,加载更多时希望被移动的视图为RecyclerView而不是CoordinatorLayout,那么设置RecyclerView为TargetView即可 |
名称 | 参数 | 描述 |
---|---|---|
setOnRefreshListener | T extends OnRefreshListener | 设置刷新事件监听回调 |
addLifecycleObserver | ILifecycleObserver | 添加生命周期监听 |
addOnStatusChangedListener | addOnStatusChangedListener | 设置内部状态改变回调 |
addOnUIPositionChangedListener | OnUIPositionChangedListener | 添加视图位置变化的监听回调 |
setOnLoadMoreScrollCallback | OnLoadMoreScrollCallback | 设置Footer完成刷新后进行平滑滚动的回调 |
setOnPerformAutoLoadMoreCallBack | OnPerformAutoLoadMoreCallBack | 设置触发自动加载更多的条件回调,如果回调的canAutoLoadMore() 方法返回true 则会立即触发加载更多 |
setOnPerformAutoRefreshCallBack | OnPerformAutoRefreshCallBack | 设置触发自动刷新的条件回调,如果回调的canAutoRefresh() 方法返回true 则会立即触发刷新 |
setOnHeaderEdgeDetectCallBack | OnHeaderEdgeDetectCallBack | 设置检查内容视图是否在顶部的重载回调(SmoothRefreshLayout内部isNotYetInEdgeCannotMoveHeader() 方法) |
setOnFooterEdgeDetectCallBack | OnFooterEdgeDetectCallBack | 设置检查内容视图是否在底部的重载回调(SmoothRefreshLayout内部isNotYetInEdgeCannotMoveFooter() 方法) |
setOnHookHeaderRefreshCompleteCallback | OnHookUIRefreshCompleteCallBack | 设置Header刷新完成的Hook回调,可实现延迟完成刷新 |
setOnHookFooterRefreshCompleteCallback | OnHookUIRefreshCompleteCallBack | 设置Footer刷新完成的Hook回调,可实现延迟完成刷新 |
setOnInsideAnotherDirectionViewCallback | OnInsideAnotherDirectionViewCallback | 设置检查手指按下点是否位于其他滚动视图内的重载回调,可自定义判断逻辑,提高判断效率 |
名称 | 参数 | 描述 |
---|---|---|
setDefaultCreator(静态方法) | IRefreshViewCreator | 设置刷新视图创建者,如果没有特殊指定刷新视图且设置的模式需要刷新视图则会调用创建者构建刷新视图 |
refreshComplete | 无参 | 刷新完成,且设置最后一次刷新状态为成功 |
refreshComplete | boolean | 刷新完成,参数:设置最后一次刷新是否刷新成功 |
refreshComplete | boolean,long | 刷新完成,参数1:设置最后一次刷新是否刷新成功,参数2:设置延迟重置刷新状态的时间(会先触发刷新视图的刷新完成回调,但在延迟的时间内库实际上状态仍是刷新状态) |
refreshComplete | long | 刷新完成,且设置最后一次刷新状态为成功,参数:设置延迟重置刷新状态的时间(会先触发刷新视图的刷新完成回调,但在延迟的时间内库实际上状态仍是刷新状态) |
setLoadingMinTime | long | 设置开始刷新到结束刷新的最小时间差(默认:500 ),参数:时间差 |
autoRefresh | 无参 | 自动触发Header刷新,立即触发刷新事件并滚动到触发Header刷新位置 |
autoRefresh | boolean | 自动触发Header刷新,参数:是否立即触发刷新事件,会滚动到触发Header刷新位置 |
autoRefresh | boolean,boolean | 自动触发Header刷新,参数1:是否立即触发刷新事件,参数2:是否滚动到触发Header刷新位置 |
autoLoadMore | 无参 | 自动触发Footer刷新,立即触发刷新事件并滚动到触发Footer刷新位置 |
autoLoadMore | boolean | 自动触发Footer刷新,参数:是否立即触发刷新事件,会滚动到触发Footer刷新位置 |
autoLoadMore | boolean,boolean | 自动触发Footer刷新,参数1:是否立即触发刷新事件,参数2:是否滚动到触发Footer刷新位置 |
名称 | 参数 | 描述 |
---|---|---|
setRatioOfHeaderToHintTwoLevel | float | 设置触发二级刷新提示时的位置占Header视图的高度比 |
setRatioOfHeaderToTwoLevel | float | 设置触发二级刷新时的位置占Header视图的高度比 |
setRatioToKeepTwoLevelHeader | float | 二级刷新中保持视图位置占Header视图的高度比(默认:1f ) |
setDisableTwoLevelRefresh | boolean | 设置是否关闭二级刷新(默认:false ) |
setDurationOfBackToKeepTwoLevel | int | 设置回滚到保持二级刷新Header视图位置的时间(默认:500 ) |
setDurationToCloseTwoLevel | int | 设置二级刷新Header刷新完成回滚到起始位置的时间(默认:500 ) |
名称 | 参数 | 描述 |
---|---|---|
autoTwoLevelRefreshHint | 无参 | 自动触发二级刷新提示并滚动到触发提示位置后回滚回起始位置 |
autoTwoLevelRefreshHint | int | 自动触发二级刷新提示并滚动到触发提示位置后停留指定时长,参数:停留多长时间 |
autoTwoLevelRefreshHint | boolean | 自动触发二级刷新提示是否滚动到触发提示位置后回滚回起始位置,参数:是否滚到到触发位置 |
autoTwoLevelRefreshHint | boolean,int | 自动触发二级刷新提示,参数1:是否滚动到触发位置,参数2:停留多长时间 |
autoTwoLevelRefreshHint | boolean,int,boolean | 自动触发二级刷新提示,参数1:是否滚动到触发位置,参数2:停留多长时间,参数3:是否可以被触摸打断,即触发提示动作过程中拦截触摸事件,直到回滚到起始位置并重置为默认状态 |
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.
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。