刷新加载(SmartRefreshLayout)

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); 
结束加载(加载失败)

状态

刷状随版本迭代越来越多,仅isRefreshing()、isLoading()无法满足。1.0.5后开放内部State并于1.0.5标记isRefreshing()、isLoading()过期(1.1.0删该两API,getState代替,比前两法更有用)。

refreshLayout.getState() == RefreshState.None 
空闲
refreshLayout.getState() == RefreshState.Loading
代替isLoading
refreshLayout.getState() == RefreshState.Refreshing
代替isRefreshing
refreshLayout.getState().isDragging 
正拖拽刷新控件否(非拖拽列表)
refreshLayout.getState().isFinishing 
动画正结束否
refreshLayout.getState().isHeader 
当前于Header一系列状中否
refreshLayout.getState().isFooter 
当前于Footer一系列状中否
refreshLayout.getState().isOpening 
等同isLoading || isRefreshing

依赖

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

使用

SmartRefreshLayout


    
    ...
    
    
        
        
                               
    

Header、Footer
  • 方式一
    全局设。所设Header、Footer优先级最低。同用方式二、三时被覆盖。
  • 方式二
    XML设Header、Footer优先级中等,同用方式三时被覆盖。
    
    
        
        ...
        
        
    
            
    
            
    
            
        
    
    
  • 方式三
    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.smartrefresh;

import com.scwang.smartrefresh.layout.SmartRefreshLayout;

import java.util.List;

import static com.scwang.smartrefresh.layout.constant.RefreshState.Loading;
import static com.scwang.smartrefresh.layout.constant.RefreshState.Refreshing;

/**
 * Created on 2019/1/10.
 *
 * @author 郑少鹏
 * @desc SmartRefreshLayoutKit
 */
public class SmartRefreshLayoutKit {
    private SmartRefreshLayout smartRefreshLayout;

    /**
     * constructor
     *
     * @param smartRefreshLayout 控件
     */
    public SmartRefreshLayoutKit(SmartRefreshLayout smartRefreshLayout) {
        this.smartRefreshLayout = smartRefreshLayout;
    }

    /**
     * 配置
     */
    public void config() {
        // 刷时禁列表操作
        smartRefreshLayout.setDisableContentWhenRefresh(false);
        // 加时禁列表操作
        smartRefreshLayout.setDisableContentWhenLoading(false);
        // 内容不满一页不可上拉加
        smartRefreshLayout.setEnableLoadMoreWhenContentNotFull(false);
    }

    /**
     * 加载
     *
     * @return 加载否
     */
    public boolean load() {
        return smartRefreshLayout.getState() == Loading;
    }

    /**
     * 状变
     */
    public void stateChangeOnError() {
        switch (smartRefreshLayout.getState()) {
            case Refreshing:
                // 刷失败(不更时间)
                smartRefreshLayout.finishRefresh(false);
                break;
            case Loading:
                // 加失败
                smartRefreshLayout.finishLoadMore(false);
                break;
            default:
                break;
        }
    }

    /**
     * 状变
     *
     * @param refreshOrLoadSuccess 刷或加成否
     * @param dataSize             数据体积
     */
    public void stateChangeOnResponse(boolean refreshOrLoadSuccess, int dataSize) {
        switch (smartRefreshLayout.getState()) {
            case Refreshing:
                if (refreshOrLoadSuccess) {
                    smartRefreshLayout.finishRefresh();
                } else {
                    // 刷失败(不更时间)
                    smartRefreshLayout.finishRefresh(false);
                }
                break;
            case Loading:
                if (refreshOrLoadSuccess) {
                    if (dataSize > 0) {
                        smartRefreshLayout.finishLoadMore();
                    } else {
                        // 显全部加完并不再触发加事件
                        smartRefreshLayout.finishLoadMoreWithNoMoreData();
                    }
                } else {
                    // 加失败
                    smartRefreshLayout.finishLoadMore(false);
                }
                break;
            default:
                break;
        }
    }

    /**
     * 刷时集合处理
     *
     * @param list 集合
     */
    public void collectionProcessOnRefresh(List... list) {
        if (smartRefreshLayout.getState() == Refreshing) {
            for (List l : list) {
                l.clear();
            }
        }
    }
}
主代码
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();                               
            } else {
                // 刷新失败(不更时间)
                smartRefreshLayout.finishRefresh(false);
            }
            break;
        case Loading:
            if (refreshOrLoadSuccess) {
                if (dataSize > 0) {
                    smartRefreshLayout.finishLoadMore();
                } else {
                // 显全部加载完并不再触发加载事件
                smartRefreshLayout.finishLoadMoreWithNoMoreData();
            }
        } else {
                // 加载失败
                smartRefreshLayout.finishLoadMore(false);
            }
            break;
        default:
            break;
    }
}

调finishLoadMore()默弹加载完成白框。不弹:

footer.setFinishDuration(0);

你可能感兴趣的:(android)