通用的可自定义头部下拉刷新布局,只实现下拉逻辑,不实现下拉头部视觉效果,功能设计参考android-Ultra-Pull-To-Refresh
- 下拉松手刷新
- 下拉刷新
- 头部固定
- 内容固定
- 刷新时是否可拖动头部
- 刷新完成是否强制返回
- 刷新时是否隐藏头部
- ViewPager等横向滑动控件共存
- 自动刷新
- 下拉松手刷新
- 超过刷新线刷新
- 头部固定
- 内容固定
- 刷新时隐藏头部
- viewpager等横向滑动兼容
- 刷新完成强制返回
- 自动刷新
- 释放刷新or下拉刷新(默认为
false
,释放刷新)
mPullToRefreshLayout.setRefreshImmediately(boolean b);
- 头部固定(默认为
false
)
mPullToRefreshLayout.setPinHeader(true);
- 内容固定(默认为
false
,建议同时关闭setCanScrollWhenRefreshing
)
mPullToRefreshLayout.setPinContent(true);
- 刷新完成强制返回(默认为
false
)
mPullToRefreshLayout.setForceToTopWhenFinish(true);
- 刷新时是否可拖动头部(默认为
true
)
mPullToRefreshLayout.setCanScrollWhenRefreshing(false);
- 开启横向滑动处理(默认为
false
,不处理横向逻辑)
mPullToRefreshLayout.setHasHorizontalChild(true);
- 上升动画时间(默认为
500ms
)
mPullToRefreshLayout.setAnimDuration(int animDuration)
- 滑动阻尼,默认为
2
mPullToRefreshLayout.setResistance(float resistance)
- 继承View or ViewGroup ,并实现HeaderController接口,详见demo
public interface HeaderController
{
/**
* 触发刷新的下拉高度,单位px,小于等于你的header高度
* @return 触发刷新的下拉高度
*/
int getThresholdHeight();
/**
* 正在刷新时的高度,单位px,小于等于你的header高度
* @return 正在刷新时的高度
*/
int getRefreshingHeight();
/**
* 当header的状态改变时会调用
*
* @param state 状态
*/
void StateChange(HeaderState state);
/**
* 开始刷新时被调用,这在个方法实现正在刷新时的动画
*/
void startRefresh();
/**
* 刷新成功时,此方法被调用
*/
void onSucceedRefresh();
/**
* 刷新失败时,此方法被调用
*/
void onFailRefresh();
/**
* 发生拖拽时时此方法会被PullToRefreshLayout调用,可以通过这个偏移量和当前的状态来决定动画的样子
* @param offset 当头部不固定时表示位置偏移量,当头部内容固定时表示头部露出的高度
* 范围为下拉时从 0 到 header.getMeasureHeight,上升反之。
void onPositionChange(float offset);
/** 当 Controller被设置到PullToRefreshLayout时调用
* @param layout 关联的PullToRefreshLayout
*/
void attachLayout(PullToRefreshLayout layout);
}
- 为PullToRefhreshLayout设置头部
mLayout.setHeader(new CustomHeader(context));
在默认情况下,当刷新完成时(即succeedRefresh、failRefresh被调用),头部会立即执行返回动画,如果你自定义的头部有刷新完成的动画,并希望这些动画执行完成之后才开始上升隐藏头部,可开启
pulltoRefreshLayout.setHandleToTopAnim(true);
开启此选项,刷新完成后头部不会上升,需要你在HeaderController中手动调用PullToRefreshLayout#notityFinishAndBack()来执行上升动画,此选项与强制上升选项冲突,开启后强制上升选项自动关闭
- PullToRefreshLayout只能有一个直接子View,
- 如果子view是一个可以scroll的控件(比如ListView、RecycleView、ScrollView),PullToRefreshLayout可以直接判断子view是否已经滑到顶部,但当子view为一个XXLayout内部包含一个ListView时
PullToRefreshLayout
FrameLauout
ListView
PullToRefreshLayout是无法判断Listview是否滑到顶的,此时需要自己实现何时应该开启下拉
mPullToRefreshLayout.setScrollableListener(new ScrollCondition() {
@Override
public boolean canRefresh()
{
if(canscroll)
return false;
return true;
}
});