/RefreshLayout

Android 下拉刷新和上拉加载更多框架。RefreshLayout可以用于嵌套任意的View。比如RecyclerView、ScrollView、WebView等,实现下拉刷新和上拉加载功能。可以设置空布局和自定义头部尾部View等。

Primary LanguageJava

RefreshLayout

Android 下拉刷新和上拉加载更多框架。RefreshLayout可以用于嵌套任意的View。比如RecyclerView、ScrollView、WebView等,实现下拉刷新和上拉加载功能。可以设置空布局和自定义头部尾部View等。

效果图

main recyclerview webview

1、引入依赖

在Project的build.gradle在添加以下代码

	allprojects {
		repositories {
			...
			maven { url 'https://jitpack.io' }
		}
	}

在Module的build.gradle在添加以下代码

  implementation 'com.github.donkingliang:RefreshLayout:1.1.2'

2、编写布局

    <com.donkingliang.refresh.RefreshLayout
        android:id="@+id/refresh_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <!-- RefreshLayout嵌套的第一个View是内容布局。必须 -->
        <android.support.v7.widget.RecyclerView
            android:id="@+id/recycler_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:overScrollMode="never" />

        <!-- RefreshLayout嵌套的第二个View表示空布局。可选 -->
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center">

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="空布局" />

        </LinearLayout>

    </com.donkingliang.refresh.RefreshLayout>

3、常用设置

//设置头部(刷新)
mRefreshLayout.setHeaderView(new HeaderView(this));

//设置尾部(加载更多)
mRefreshLayout.setFooterView(new FooterView(this));

//设置刷新监听,触发刷新时回调
mRefreshLayout.setOnRefreshListener(new RefreshLayout.OnRefreshListener() {
    @Override
    public void onRefresh() {
        // 刷新回调
        }
    });

//设置上拉加载更多的监听,触发加载时回调。
//RefreshLayout默认没有启用上拉加载更多的功能,如果设置了OnLoadMoreListener,则自动启用。
mRefreshLayout.setOnLoadMoreListener(new RefreshLayout.OnLoadMoreListener() {
    @Override
    public void onLoadMore() {
        // 加载回调 
        }
    });

// 启用下拉刷新功能。默认启用
mRefreshLayout.setRefreshEnable(true);

// 启用上拉加载更多功能。默认不启用,如果设置了OnLoadMoreListener,则自动启用。
mRefreshLayout.setLoadMoreEnable(true);

// 是否还有更多数据,只有为true是才能上拉加载更多,它会回调FooterView的onHasMore()方法。默认为true。
mRefreshLayout.hasMore(true);

//自动触发下拉刷新。只有启用了下拉刷新功能时起作用。
mRefreshLayout.autoRefresh();

//自动触发上拉加载更多,在滑动到底部的时候,自动加载更多。只有在启用了上拉加载更多功能并且有更多数据时起作用。
mRefreshLayout.autoLoadMore();

//通知刷新完成,isSuccess是否刷新成功
mRefreshLayout.finishRefresh(boolean isSuccess);

//通知加载完成,isSuccess是否加载成功,hasMore是否还有更多数据
mRefreshLayout.finishLoadMore(boolean isSuccess,boolean hasMore);

// 是否自动触发加载更多。只有在启用了上拉加载更多功能时起作用。
mRefreshLayout.setAutoLoadMore(true);

// 隐藏内容布局,显示空布局。
mRefreshLayout.showEmpty();

// 隐藏空布局,显示内容布局。
mRefreshLayout.hideEmpty();

4、自定义头部和尾部

一般来说,RefreshLayout的头部和尾部的View需要开发者自己实现,因为在实际的开发中往往需要我们自己定义头部、尾部的样式和控制状态。框架中提供了一个简单的头部(HeaderView)和尾部(FooterView),这两个View的实现比较简单,样式也不是很好看,可以作为开发者自定义头部和尾部的参考吧。

框架中提供了自定义头部和尾部View的接口,使用这些接口可以很简单的实现和控制自己的头部和尾部。

自定义头部必须实现RefreshLayout.OnHeaderStateListener接口,并通过这个接口的回调来控件头部的状态。

public class MyHeaderView extends LinearLayout implements RefreshLayout.OnHeaderStateListener{

    public MyHeaderView(Context context) {
        super(context);
    }

    public MyHeaderView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    public MyHeaderView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    /**
     * 头部滑动变化
     *
     * @param headerView   头部View
     * @param scrollOffset 滑动距离
     * @param scrollRatio  从开始到触发阀值的滑动比率(0到100)如果滑动到达了阀值,就算再滑动,这个值也是100
     */
    @Override
    public void onScrollChange(View headerView, int scrollOffset, int scrollRatio) {
    }

    /**
     * 头部处于刷新状态 (触发下拉刷新的时候调用)
     *
     * @param headerView 头部View
     */
    @Override
    public void onRefresh(View headerView) {
    }

    /**
     * 刷新完成,头部收起
     *
     * @param headerView 头部View
     @param isSuccess  是否刷新成功
     */
    @Override
    public void onRetract(View headerView, boolean isSuccess) {
    }
}

自定义尾部必须实现RefreshLayout.OnFooterStateListener接口,并通过这个接口的回调来控件尾部的状态。

public class MyFooterView extends LinearLayout implements RefreshLayout.OnFooterStateListener{

    public MyFooterView(Context context) {
        super(context);
    }

    public MyFooterView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    public MyFooterView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    /**
     * 尾部滑动变化
     *
     * @param footerView   尾部View
     * @param scrollOffset 滑动距离
     * @param scrollRatio  从开始到触发阀值的滑动比率(0到100)如果滑动到达了阀值,就算在滑动,这个值也是100
     */
    @Override
    public void onScrollChange(View footerView, int scrollOffset, int scrollRatio) {
    }

    /**
     * 尾部处于加载状态 (触发上拉加载的时候调用)
     *
     * @param footerView 尾部View
     */
    @Override
    public void onRefresh(View footerView) {
    }

    /**
     * 加载完成,尾部收起
     *
     * @param footerView 尾部View
     @param isSuccess  是否加载成功
     */
    @Override
    public void onRetract(View footerView, boolean isSuccess) {
    }

    /**
     * 是否还有更多(是否可以加载下一页)
     *
     * @param footerView
     * @param hasMore
     */
    @Override
    public void onHasMore(View footerView, boolean hasMore) {
    }
}