Home

Awesome

TLRLoadRefresh

TLRLoadRefresh是一个支持ListView,RecycleView,ViewGroup等下拉刷新和上拉加载的UI组件,使用具有很大的灵活性。可以根据自己的不同需求来定义不同UI设计,可以灵活的自定义下拉刷新的Head和上拉加载的Foot,下面将介绍该控件的使用方法和设计思想,首先先看下效果。

1 2 3 4

控件属性介绍

下面对控件的属性坐下介绍,如果描述有不清楚的地方,大家可以自行运行demo查看,demo中也用到我自己写的一个缓存框架,TCache,也欢迎大家star。

TLRLinearLayout属性介绍,如下:

    <declare-styleable name="TLRLinearLayout">
        <attr name="enableRefresh" format="boolean"/>
        <attr name="enableLoad" format="boolean"/>
        <attr name="refreshThreshold" format="float"/>
        <attr name="loadThreshold" format="float"/>
        <attr name="refreshMaxMoveDistance" format="dimension"/>
        <attr name="loadMaxMoveDistance" format="dimension"/>
        <attr name="closeAnimDuration" format="integer"/>
        <attr name="openAnimDuration" format="integer"/>
        <attr name="resistance" format="float"/>
        <attr name="releaseRefresh" format="boolean"/>
        <attr name="releaseLoad" format="boolean"/>
        <attr name="keepHeadRefreshing" format="boolean"/>
        <attr name="keepFootLoading" format="boolean"/>
        <attr name="keepContentLayout">
            <flag name="refresh" value="0x01"/>
            <flag name="load" value="0x02"/>
        </attr>
        <attr name="canMoveHeadByTLR" format="boolean"/>
        <attr name="canMoveFootByTLR" format="boolean"/>
    </declare-styleable>

TLRLinearLayout子控件label设置

    <declare-styleable name="TLRLinearLayout_Layout">
        <attr name="label" format="enum"> 
            <enum name="head" value="1"/><!--标记view是刷新的head-->
            <enum name="content" value="2"/><!--标记为可刷新体,TLRLinearLayout可以有多个刷新体,可以查看demo-->
            <enum name="foot" value="3"/><!--标记view是加载的foot-->
        </attr>
    </declare-styleable>

TLRLinearLayout子类TLRNestedLinearLayout

TLRNestedLinearLayout子类是支持android的嵌套滑动,可以支持RecycleView,NestedScrollView等嵌套滑动view的下拉刷新和上拉加载,具体可以查看demo

回调接口TLRUIHandler介绍

public interface TLRUIHandler {
    /**
     * 指定view刷新状态的回调
     */
    void onRefreshStatusChanged(View target, TLRLinearLayout.RefreshStatus status);

    /**
     * 指定view加载状态的回调
     */
    void onLoadStatusChanged(View target, TLRLinearLayout.LoadStatus status);

    /**
     * 指定view坐标信息的回调
     * @param target 哪个view触发的位置变化
     * @param isRefresh 是否时刷新
     * @param totalOffsetY touch Y方向移动的距离
     * @param totalThresholdY Y方向通过刷新系数计算的移动距离
     * @param offsetY Y方向相对移动的距离
     * @param threshOffset Y方向移动变化系数
     */
    void onOffsetChanged(View target, boolean isRefresh, int totalOffsetY, int totalThresholdY,
            int offsetY, float threshOffset);

    /**
     * 刷新或加载完成时状态的回调
     */
    void onFinish(View target, boolean isRefresh, boolean isSuccess, int errorCode);
}

刷新或加载完成时hook keepview接口TLRUIHandlerHook

在加载或刷新完成时,head或foot view有时想完成一些自己的动画,比如类似原生的MaterialHeaderView在加载完成时,想先做一个缩小动画,然后在让TLRLinearLayout完成剩下的动画,这时候就用到了TLRUIHandlerHook,具体可参考MaterialHeaderView实现。这种设计思想源自于android-Ultra-Pull-To-Refresh,感谢大牛们的贡献。

实现原理介绍

暂略

总结

在实现过程中我参考了一些优秀的开源库,感谢这些无私的大牛们做出的贡献;这个库目前没有进一步封装,因为我还没有做过全面的测试,所以如果有问题欢迎大家指正,并提issues