刷新加载(SmartRefreshLayout)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zsp_android_com/article/details/86235067

SmartRefreshLayout

属性

app:srlEnablePreviewInEditMode="true"
编辑模式预览效果否(默true)

于SmartRefreshLayout中,Header、Footer中无效
app:srlAccentColor="@color/background" 
强调色
app:srlPrimaryColor="@color/viewfinder_mask"
主题色

SmartRefreshLayout、Header、Footer均可,但Header、Footer会覆盖SmartRefreshLayout
app:srlTextSizeTitle="@dimen/sp_14"
标题文字大小(默16sp)
app:srlTextSizeTitle="@dimen/sp_12"
时间文字大小(默12sp)

方法

refreshLayout.autoRefresh();  
自动刷新
refreshLayout.finishRefresh(); 
刷新完成
refreshLayout.finishRefresh(int delayed);   
刷新完成(参数delayed延时)
refreshLayout.finishLoadMore();      
加载完成
refreshLayout.finishLoadMore(int delayed); 
加载完成(参数delayed延时)
refreshLayout.finishRefresh(false);
结束刷新(刷新失败)
refreshLayout.finishLoadMore(false); 
结束加载(加载失败)

依赖

implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.0.5.1'

SmartRefreshLayout

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/background"
    android:orientation="vertical">
    
    ...
    
    <com.scwang.smartrefresh.layout.SmartRefreshLayout
        android:id="@+id/taskStatisticsRl"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        
        <android.support.v7.widget.RecyclerView
            android:id="@+id/taskStatisticsRvContent"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:scrollbars="none" />
                               
    </com.scwang.smartrefresh.layout.SmartRefreshLayout>
</LinearLayout>

Header、Footer

  • 方式一
    全局设。所设Header、Footer优先级最低。同用方式二、三时被覆盖。
  • 方式二
    XML设Header、Footer优先级中等,同用方式三时被覆盖。
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/background"
        android:orientation="vertical">
        
        ...
        
        <com.scwang.smartrefresh.layout.SmartRefreshLayout
            android:id="@+id/taskStatisticsRl"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
    
            <com.scwang.smartrefresh.layout.header.ClassicsHeader
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                app:srlAccentColor="@color/background"
                app:srlPrimaryColor="@color/viewfinder_mask"
                app:srlTextSizeTitle="@dimen/sp_14" />
    
            <android.support.v7.widget.RecyclerView
                android:id="@+id/taskStatisticsRvContent"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:scrollbars="none" />
    
            <com.scwang.smartrefresh.layout.footer.ClassicsFooter
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                app:srlAccentColor="@color/background"
                app:srlPrimaryColor="@color/viewfinder_mask"
                app:srlTextSizeTitle="@dimen/sp_14" />
        </com.scwang.smartrefresh.layout.SmartRefreshLayout>
    </LinearLayout>
    
  • 方式三
    final RefreshLayout refreshLayout = (RefreshLayout) findViewById(R.id.refreshLayout);
    // Header为贝塞尔雷达样式
    refreshLayout.setRefreshHeader(new BezierRadarHeader(this).setEnableHorizontalDrag(true));
    // Footer为球脉冲样式
    refreshLayout.setRefreshFooter(new BallPulseFooter(this).setSpinnerStyle(SpinnerStyle.Scale));
    

监听

刷新

taskStatisticsRl.setOnRefreshListener(new OnRefreshListener() {
    @Override
    public void onRefresh(RefreshLayout refreshLayout) {
                           
    }
});

加载

taskStatisticsRl.setOnLoadMoreListener(new OnLoadMoreListener() {
    @Override
    public void onLoadMore(RefreshLayout refreshlayout) {
                    
    }
});

刷新加载

taskStatisticsRl.setOnRefreshLoadMoreListener(new OnRefreshLoadMoreListener() {
    @Override
    public void onLoadMore(RefreshLayout refreshLayout) {

    }

    @Override
    public void onRefresh(RefreshLayout refreshLayout) {

    }
});

多功能

taskStatisticsRl.setOnMultiPurposeListener(new OnMultiPurposeListener() {...});

SmartRefreshLayoutKit

package widget.refreshload;

import com.scwang.smartrefresh.layout.SmartRefreshLayout;
import com.scwang.smartrefresh.layout.constant.RefreshState;

/**
 * Created on 2019/1/10.
 *
 * @author 郑少鹏
 * @desc SmartRefreshLayoutKit
 */
public class SmartRefreshLayoutKit {
    /**
     * 配置
     *
     * @param smartRefreshLayout 控件
     */
    public static void config(SmartRefreshLayout smartRefreshLayout) {
        // 刷新时禁列表操作
        smartRefreshLayout.setDisableContentWhenRefresh(false);
        // 加载时禁列表操作
        smartRefreshLayout.setDisableContentWhenLoading(false);
        // 内容不满一页不可上拉加载
        smartRefreshLayout.setEnableLoadMoreWhenContentNotFull(false);
    }

    /**
     * 状态改变
     *
     * @param smartRefreshLayout 控件
     * @param refreshState       刷新状态
     */
    public static void stateChangeOnError(SmartRefreshLayout smartRefreshLayout, RefreshState refreshState) {
        switch (refreshState) {
            case Refreshing:
                // 刷新失败(不更时间)
                smartRefreshLayout.finishRefresh(false);
                break;
            case Loading:
                // 加载失败
                smartRefreshLayout.finishLoadMore(false);
                break;
            default:
                break;
        }
    }

    /**
     * 状态改变
     *
     * @param smartRefreshLayout   控件
     * @param refreshState         刷新状态
     * @param refreshOrLoadSuccess 刷新或加载成功否
     * @param dataSize             数据体积
     */
    public static void stateChangeOnResponse(SmartRefreshLayout smartRefreshLayout, RefreshState refreshState, boolean refreshOrLoadSuccess, int dataSize) {
        switch (refreshState) {
            case Refreshing:
                if (refreshOrLoadSuccess) {
                    smartRefreshLayout.finishRefresh();
                    // 恢复无更多数据原始状
                    smartRefreshLayout.setNoMoreData(false);
                } else {
                    // 刷新失败(不更时间)
                    smartRefreshLayout.finishRefresh(false);
                }
                break;
            case Loading:
                if (refreshOrLoadSuccess) {
                    if (dataSize > 0) {
                        smartRefreshLayout.finishLoadMore();
                    } else {
                        // 显全部加载完并不再触发加载事件
                        smartRefreshLayout.finishLoadMoreWithNoMoreData();
                    }
                } else {
                    // 加载失败
                    smartRefreshLayout.finishLoadMore(false);
                }
                break;
            default:
                break;
        }
    }
}

主代码

OkHttpUtils
        .get()
        .addHeader("token", ...)
        .url(...)
        .tag(this)
        .build()
        .execute(new StringCallback() {
            @Override
            public void onError(Call call, Exception e, int id) {               
                SmartRefreshLayoutKit.stateChangeOnError(taskStatisticsRl, taskStatisticsRl.getState());
            }

            @Override
            public void onResponse(String response, int id) {             
                if (InterfaceResponseCode.flag(response)) {
                	...                                                   
                } else {
                 	...                           
                }                       
                SmartRefreshLayoutKit.stateChangeOnResponse(taskStatisticsRl, taskStatisticsRl.getState(), InterfaceResponseCode.flag(response), listBeanResult.size());
            }
        });

问题

显全部加载完并不再触发加载事件。

/**
 * 状态改变
 *
 * @param smartRefreshLayout   控件
 * @param refreshState         刷新状态
 * @param refreshOrLoadSuccess 刷新或加载成功否
 * @param dataSize             数据体积
 */
public static void stateChange(SmartRefreshLayout smartRefreshLayout, RefreshState refreshState, boolean refreshOrLoadSuccess, int dataSize) {
    switch (refreshState) {
        case Refreshing:
            if (refreshOrLoadSuccess) {
                smartRefreshLayout.finishRefresh();
                // 恢复无更多数据原始状
                smartRefreshLayout.setNoMoreData(false);
            } else {
                // 刷新失败(不更时间)
                smartRefreshLayout.finishRefresh(false);
            }
            break;
        case Loading:
            if (refreshOrLoadSuccess) {
                if (dataSize > 0) {
                    smartRefreshLayout.finishLoadMore();
                } else {
                // 显全部加载完并不再触发加载事件
                smartRefreshLayout.finishLoadMoreWithNoMoreData();
            }
        } else {
                // 加载失败
                smartRefreshLayout.finishLoadMore(false);
            }
            break;
        default:
            break;
    }
}

猜你喜欢

转载自blog.csdn.net/zsp_android_com/article/details/86235067
今日推荐