/PullToRefresh

可自定义头部的下拉刷新布局

Primary LanguageJava

PullToRefresh

通用的可自定义头部下拉刷新布局,只实现下拉逻辑,不实现下拉头部视觉效果,功能设计参考android-Ultra-Pull-To-Refresh

主要功能特性

  • 下拉松手刷新
  • 下拉刷新
  • 头部固定
  • 内容固定
  • 刷新时是否可拖动头部
  • 刷新完成是否强制返回
  • 刷新时是否隐藏头部
  • ViewPager等横向滑动控件共存
  • 自动刷新

Demo

  • 下拉松手刷新

  • 超过刷新线刷新

  • 头部固定

  • 内容固定

  • 刷新时隐藏头部

  • 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)

自定义头部

  1. 继承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);

}
  1. 为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;
           }
       });