Giter Club home page Giter Club logo

commonpulltorefresh's Introduction

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

commonpulltorefresh's People

Contributors

bryant1410 avatar chanven avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

commonpulltorefresh's Issues

如何支持scrollview

如果代码执行到这里就会抛出异常,请问是怎么兼容scrollview的
if (null == mLoadMoreHandler) { if (mContentView instanceof GridView) { mLoadMoreHandler = new GridViewHandler(); } else if (mContentView instanceof AbsListView) { mLoadMoreHandler = new ListViewHandler(); } else if (mContentView instanceof RecyclerView) { mLoadMoreHandler = new RecyclerViewHandler(); } } if (null == mLoadMoreHandler) { throw new IllegalStateException("unSupported contentView !"); }

下拉刷新WebVeiw

下拉刷新WebVeiw
WebVeiw 里向下滚动后 向上滑 回不到顶部 直接刷新 WebView.reload(); 后 依然回不到首页

[内存泄漏]使用leakCanary 发现内存泄漏

  • GC ROOT android.view.Choreographer$FrameDisplayEventReceiver.mMessageQueue
    * references android.os.MessageQueue.mMessages
    * references android.os.Message.next
    * references android.os.Message.next
    * references android.os.Message.next
    * references android.os.Message.next
    * references android.os.Message.next
    * references android.os.Message.next
    * references android.os.Message.next
    * references android.os.Message.next
    * references android.os.Message.next
    * references android.os.Message.next
    * references android.os.Message.next
    * references android.os.Message.next
    * references android.os.Message.next
    * references android.os.Message.next
    * references android.os.Message.next
    * references android.os.Message.next
    * references android.os.Message.next
    * references android.os.Message.next
    * references android.os.Message.next
    * references android.os.Message.next
    * references android.os.Message.callback
    * references com.chanven.lib.cptr.PtrFrameLayout$2.this$0 (anonymous class implements java.lang.Runnable)

recyleview错误

android Studio中使用出现recyleview multidex错误,使用的版本为v7-23.1.0,demo可以运行,但是移植module后出现该问题,希望能给予提示

使用RecyclerView 加载到第二页后,再去拉下刷新(同时向下滚动),报异常!

java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid item position 4(offset:4).state:11
at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4405)
at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4363)
at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:1961)
at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1370)
at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1333)
at android.support.v7.widget.LinearLayoutManager.scrollBy(LinearLayoutManager.java:1161)
at android.support.v7.widget.LinearLayoutManager.scrollVerticallyBy(LinearLayoutManager.java:1018)
at android.support.v7.widget.RecyclerView$ViewFlinger.run(RecyclerView.java:3807)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:780)
at android.view.Choreographer.doCallbacks(Choreographer.java:593)
at android.view.Choreographer.doFrame(Choreographer.java:561)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:766)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5314)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:864)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:680)
at dalvik.system.NativeStart.main(Native Method)

java.lang.RuntimeException

java.lang.RuntimeException: Don't call setOnClickListener for an AdapterView. You probably want setOnItemClickListener instead

RecycleView 上拉不会自动加载更多

demo中 recycle view 上拉没反应,要点了才能加载。why?
---》不知道算不算解决:
搞了大半天,才发现support版本问题,如果用23.4.0则出现上面的问题,改回成23.1.1,问题解决。

跟AppBarLayout有冲突

我现在标题用design包里面的AppBarLayout,下拉的问题被我解决了,但是上拉加载更多之后,然后往上滑动,AppBarLayout出现的时候是空的。。。不知道作者知道什么问题吗?

感谢分享--提点小建议

原来工程一直用pulltorefresh,今天挖到这个,感觉还不错,但有几个建议
1.把替换加载图片和加载文字做成接口(目前可以替换图片,但没有替换加载文字的,这个pulltorefresh要好点,全接口形式)
2.能不能灵活点可配置一些东西(比如加载更多,我可以配置成上提界面实现加载,也可以配置成自动加载,(总要是产品很多要求,一会要自动,一会要上提))

3Q,辛苦

如何设置上拉加载的样式

我需要修改上拉加载的样式,但是找不到地方设置.
在PtrFrameLayout中已经被写死了

private ILoadViewMoreFactory loadViewFactory = new DefaultLoadMoreFooter();  //line 1046

recyclerview-v7:23.2.1以上,autoMeasure导致的FooterView满屏的问题

最新的recyclerview加了autoMeasure功能,在 RecyclerAdapterWithHF 中的onCreateViewHolder里面,
自己创建的HeaderFooterView不应该在用MATCH_PARENT了.

FrameLayout frameLayout = new FrameLayout(viewGroup.getContext()); // make sure it fills the space frameLayout.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); return new HeaderFooterViewHolder(frameLayout);

提个问题

这个下拉刷新的控件里面只能包含一个控件而且是View还不能是Layout吗?我用这个布局包含一个RelativeLayout,设置可以加载更多时就崩溃,而且RelativeLayout包含ListView的话可以上滑但没办法下滑

Demo:ListView当footView出现一点就开始加载更多,而RecyclerView需要footView全部出现才可以加载更多?

我在运行Demo的时候发现2个问题:都是上拉加载更多
第一个:
若是ListView,那么当footView出现一点点的时候就会加载更多,而RecyclerView需要footView全部出现才会加载更多。
第二个:
mData.add(new String(" RecyclerView item - add " + page));
mAdapter.notifyDataSetChanged();
必须在一起,如果采用mHandler.sendEmptyMessageDelayed(123, 1500);把加载数据和 mAdapter.notifyDataSetChanged();分开,会有bug。

    ptrClassicFrameLayout.setPtrHandler(new PtrDefaultHandler() {

        @Override
        public void onRefreshBegin(PtrFrameLayout frame) {
                 mData.add(new String("  RecyclerView item  - add " + page));
                mHandler.sendEmptyMessageDelayed(123, 1500);
        }
    });


private Handler mHandler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
        if (msg.what == 123) {
            mAdapter.notifyDataSetChanged();
            ptrClassicFrameLayout.loadMoreComplete(true);
            page++;
            Toast.makeText(RecyclerViewActivity.this, "load more complete", Toast.LENGTH_SHORT).show();
        }
    }
};

会出现bug:一次正常有1.5s的间隔,一次没有(直接是加载更多后的结果),依次循环。

有关RecycleView 的问题

您好:
下面是有关于RecycleView的问题
作者在RecyclerAdapterWithHF中对adapter添加header 和footer
mAdapter.addHeader(mHeader);
mAdapter.addFooter(mHeader);
当LinearLayoutManager 为 StaggeredGridLayoutManager时列数大于1
addHeader 和 addFooter 变为Item,布局错位,看了代码后发现,作者是在把view 当做adapter 的一个Item 给添加进去的,这样当为StaggeredGridLayoutManager 或GridView ,列数大于1,添加的头部和底部会变形,还有加载更多 同样
public void addHeader(View header) {
if (!mHeaders.contains(header)) {
mHeaders.add(header);
// animate
notifyItemInserted(mHeaders.size() - 1);
}
}

      mAdapter = new RecyclerAdapterWithHF(adapter);

// mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
// mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(4,
// StaggeredGridLayoutManager.VERTICAL));
mRecyclerView.setLayoutManager(new GridLayoutManager(this, 2));

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.