QRefreshLayout,用法同SwipeRefreshLayout,支持所有View,兼容NestedScroll,支持自定义header footer,支持下拉到二楼

公司项目之前一直使用官方SwipeRefreshLayout,效果不错但是扩展性较差,找遍了市面上的下拉刷新控件,对Nested滚动的支持都不是很好,奈何公司项目有两个页面实现效果需要支持Nested滚动。产品经理不止一次产生了修改下拉刷新动画的念头,都被我以下拉刷新控件不好替换为由勉强延后,但是问题总得解决,没有轮子就自己造一个,用了差不多两周的时间,终于完成了自己的下拉刷新及加载更多控件。
github地址: https://github.com/zhangxq/QRefreshLayout

简介

QRefreshLayout参考了SwipeRefreshLayout,所以使用方法和SwipeRefreshLayout相同,并且增加了上拉加载更多功能,支持所有View子类的刷新,支持Nested嵌套滚动,支持自定义header和footer,支持下拉到二楼,接口友好,方便简单。

demo下载

demo下载

效果展示

下拉刷新和加载更多
与Nested滚动兼容效果
下拉到二楼

使用方式

	allprojects {
		repositories {
			...
			maven { url 'https://jitpack.io' }
		}
	}
	dependencies {
		implementation 'com.github.zhangxq:QRefreshLayout:1.0.8'
	}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <com.zhangxq.refreshlayout.QRefreshLayout
        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" />
    </com.zhangxq.refreshlayout.RefreshLayout>
</LinearLayout>
  refreshLayout.setOnRefreshListener(this);
  refreshLayout.setOnLoadListener(this);

更多接口使用方式,请查看demo源码。

接口说明

名称功能
setOnRefreshListener设置下拉刷新监听
setOnLoadListener设置加载更多监听
setRefreshing打开或者关闭下拉刷新动画
setLoading打开或关闭加载更多动画
setColorSchemeResources setColorSchemeColors设置默认下拉刷新进度圈颜色
setProgressBackgroundColorSchemeResource setProgressBackgroundColorSchemeResource设置默认下拉刷新进度圈背景颜色
setRefreshView设置下拉刷新view
setLoadView设置加载更多view
setLoadEnable设置加载更多开关, setOnLoadListener调用后默认开启
setAutoLoad设置自动加载更多开关,setOnLoadListener调用后默认开启
setListViewScrollListener设置ListView的滚动监听器(由于需要做自动加更多,所以占用了监听器,在这里回调回来)
setPullToRefreshHeight设置下拉到"释放即可更新"的高度(默认170px)
setLoadToRefreshHeight设置上拉到"释放即可加载更多"的高度(默认170px)
setRefreshHeight设置下拉刷新动画高度(默认150px,需要在setRefreshing之前调用)
setLoadHeight设置加载更多动画高度(默认110px)
setIsCanSecondFloor设置是否可以到达二楼
setSecondFloorView设置二楼view,仅限于使用默认header的情况
isSecondFloor当前是否在二楼
setBackToFirstFloor回到一楼
setPullToSecondFloorHeight设置下拉到"释放到达二楼"的高度(默认500px)

自定义header和footer

setRefreshView 和 setLoadView 两个方法用于接收用户自定义的header和footer,setRefreshView接收一个继承自RefreshView的view,setLoadView接收一个继承自LoadView的view,RefreshView和LoadView的区别只是RefreshView比LoadView多了三个二楼相关的虚方法,所以我们只用看一下RefreshView的源码:

import android.content.Context;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.Gravity;
import android.widget.RelativeLayout;

import com.zhangxq.refreshlayout.defaultview.Refresh;

/**
 * Created by zhangxiaoqi on 2019/4/22.
 */

public abstract class RefreshView extends RelativeLayout implements Refresh {
    public RefreshView(Context context) {
        this(context, null);
    }

    public RefreshView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        setGravity(Gravity.CENTER);
    }

    /**
     * 释放即可到达二楼
     */
    public abstract void setReleaseToSecondFloor();

    /**
     * 展示二楼
     */
    public abstract void setToSecondFloor();

    /**
     * 回到一楼
     */
    public abstract void setToFirstFloor();
}

查看方法的注释,就可以明白对应的功能。
RefreshView和LoadView都实现了一个Refresh接口,代码如下:

public interface Refresh {
    /**
     * 手指拖动中
     *
     * @param height        显示出来的区域高度
     * @param refreshHeight 下拉到触发刷新位置的显示区域高度
     * @param totalHeight   总的显示区域高度
     */
    void setHeight(float height, float refreshHeight, float totalHeight);

    /**
     * 触发刷新
     */
    void setRefresh();

    /**
     * 下拉刷新
     */
    void setPullToRefresh();

    /**
     * 释放即可刷新
     */
    void setRefeaseToRefresh();
}

可以看到,接口提供了三个回调方法,对应与下拉或上拉过程中常用的三个时间点,还有一个setHeight方法提供了手指拖动的距离,方便用户处理拖动动画。
继承RefreshView或者LoadView覆盖这四个方法,就可以方便得实现自己想要的动画效果。

下拉到二楼功能

使用默认header情况下,如下两行即可实现下拉到二楼的功能,第二行的参数view就是你想要展示的二楼布局view。

qRefreshLayout.setIsCanSecondFloor(true);
qRefreshLayout.setSecondFloorView(view);

使用自定义header,则可以去掉第二行,然后使用自定义header中的三个回调方法,实现自己的二楼效果。

onemore

如果只想在SwipeRefreshLayout基础上增加加载更多功能,请查看我的另一篇博文:继承自SwipeRefreshLayout,实现加载更多
如果这篇博文帮到了您,请给我的github点个小星星吧,感谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值