Android widget with pull to refresh for all the views,and support loadMore for ListView , RecyclerView, GridView and SwipeRefreshLayout.

Min SDK   14
Latest Commit   2017-05-10 07:45:10
License   Apache-2.0

Github   https://github.com/Chanven/CommonPullToRefresh

         

使用APP客户端扫描二维码运行Demo


...

Chanven
China Telecom
GuangZhou


         

类似的还有....
RecyclerRefreshLayout A pull to refresh layout for android, the RecyclerRefreshLayout is based on the SwipeRefreshLayout. support all the views, highly customizable, code simplicity, etc
TwinklingRefreshLayout RefreshLayout that support for OverScroll and better than iOS. 支持下拉刷新和上拉加载的RefreshLayout,自带越界回弹效果,支持RecyclerView,AbsListView,ScrollView,WebView
JellyRefreshLayout A pull-down-to-refresh layout inspired by Lollipop overscrolled effects
README

README.md

CommonPullToRefresh

Android widget with pull to refresh for all the views,and support loadMore for ListView,RecyclerView,GridView and SwipeRefreshLayout.

android-Ultra-Pull-To-Refresh的基础上增加了加载更多的支持,感谢作者

  • 下拉刷新支持大部分viewListViewScrollViewWebView等,甚至一个单独的TextView
  • 加载更多目前支持ListViewRecyclerViewGridViewSwipeRefreshLayout
  • 支持自定义header以及footer
  • 增加SwipeRefreshLayout刷新方式,同样支持加载更多

Demo APK下载

ListView、RecyclerView截图

GridView截图

SwipeRefreshLayout截图

Usage

Gradle / Android Studio

compile 'com.chanven.lib:cptr:1.1.0'

下拉刷新配置

有6个参数可配置:

  • 阻尼系数

    默认: 1.7f,越大,感觉下拉时越吃力。 mPtrFrame.setResistance(1.7f)

  • 触发刷新时移动的位置比例

    默认,1.2f,移动达到头部高度1.2倍时可触发刷新操作。 mPtrFrame.setRatioOfHeaderHeightToRefresh(1.2f)

  • 回弹延时

    默认 200ms,回弹到刷新高度所用时间。 mPtrFrame.setDurationToClose(200)

  • 头部回弹时间

    默认1000msmPtrFrame.setDurationToCloseHeader(1000)

  • 刷新是保持头部

    默认值 truemPtrFrame.setKeepHeaderWhenRefresh(true)

  • 下拉刷新 / 释放刷新

    默认为释放刷新,即falsemPtrFrame.setPullToRefresh(false)

上面是在java代码中配置,也可在xml文件中配置
<?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.chanven.lib.cptr.PtrClassicFrameLayout
        android:id="@+id/test_list_view_frame"
        xmlns:cube_ptr="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#f0f0f0"
        cube_ptr:ptr_resistance="1.7"
        cube_ptr:ptr_ratio_of_header_height_to_refresh="1.2"
        cube_ptr:ptr_duration_to_close="200"
        cube_ptr:ptr_duration_to_close_header="1000"
        cube_ptr:ptr_keep_header_when_refresh="true"
        cube_ptr:ptr_pull_to_fresh="false">

        <ListView
            android:id="@+id/test_list_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@android:color/white"
            android:choiceMode="singleChoice"
            android:divider="#b0b0b0"
            android:dividerHeight="0.1dp"
            android:fadingEdge="none"
            android:scrollbarStyle="outsideOverlay"/>
    </com.chanven.lib.cptr.PtrClassicFrameLayout>

</LinearLayout>

处理刷新

通过PtrHandler,可以检查确定是否可以下来刷新以及在合适的时间刷新数据。

检查是否可以下拉刷新在PtrDefaultHandler.checkContentCanBePulledDown中有默认简单的实现,你可以根据实际情况完成这个逻辑。

public interface PtrHandler {
    /**
     * 检查是否可以执行下来刷新,比如列表为空或者列表第一项在最上面时。
     * <p/>
     * {@link com.chanven.lib.cptr.PtrDefaultHandler#checkContentCanBePulledDown}
     */
    public boolean checkCanDoRefresh(final PtrFrameLayout frame, final View content, final View header);

    /**
     * 需要加载数据时触发
     *
     * @param frame
     */
    public void onRefreshBegin(final PtrFrameLayout frame);
}

加载更多配置

  • 是否需要加载更多 默认false mPtrFrame.setLoadMoreEnable(true)
  • 是否自动加载 默认true mPtrFrame.setAutoLoadMoreEnable(true)

Header、Footer样式

  • Header 实现接口PtrUIHandler,已有默认实现PtrClassicDefaultHeader,并通过PtrFrameLayout.setHeaderView(View header)设置
  • Footer 实现接口ILoadMoreViewFactory,已有默认实现DefaultLoadMoreViewFooter,并通过PtrFrameLayout.setFooterView(ILoadMoreViewFactory factory)设置

常见问题

  • ViewPager滑动冲突: disableWhenHorizontalMove()
  • 长按LongPressed, setInterceptEventWhileWorking()
  • 如果要禁用下拉刷新,则更改PtrHandler.checkCanDoRefresh的返回实现即可

具体栗子可参考Demo