Giter Club home page Giter Club logo

genius158 / pullrefreshlayout Goto Github PK

View Code? Open in Web Editor NEW
650.0 15.0 104.0 30.99 MB

下拉刷新,上拉加载,真实的回弹(overscroll)效果(媲美qq),且大小只有37KB(是其他主流刷新库或回弹库的1/2,1/3,甚至是1/4),同时,自定义header和footer,可以实现任何你想的到的功能(例如:自动触发加载更多、二级刷新等)

Java 100.00%
refreshlayout bouncy overscroll pull-to-refresh pulltorefresh header footer

pullrefreshlayout's Introduction

PullRefreshLayout(这是一个专注回弹和手势操作无阻塞的刷新库,而且够小)

由于SDK 26.1.0各种兼容库在API14以下都已经不再适配了,相关的兼容方法,兼容的class都已经被废弃了,甚至MD也只支持API14以上,可见google已经测底放弃了android4.0以下的设备, 所以跟随google大大的脚步,PullRefreshLayout也将MinSdk 上调到API14.
Stable Version Latest Version MinSdk Methods

header和状态切换演示gif
header和状态切换演示gif

二级刷新
二级刷新 二级刷新

嵌套滑动
嵌套滑动 嵌套滑动 嵌套滑动

滴滴,支付宝刷新(看刷新的位置,不包括loading动画)详情
滴滴 支付宝

加载更多,加载完成,保持footer
保持footer

fun header 来自from https://github.com/scwang90/SmartRefreshLayout
fun header

包裹ViewPager 参考: https://github.com/genius158/PullRefreshLayout/blob/developer/app/src/main/java/com/yan/refreshloadlayouttest/testactivity/CommonActivity5.java

包裹CoordinatorLayout 参考:https://github.com/genius158/PullRefreshLayout/blob/master/app/src/main/java/com/yan/refreshloadlayouttest/testactivity/ScrollingActivity.java

1.概述

本库的主要特点:完美契合嵌套滑动,和与其他回弹刷新库相比更加真实的回弹效果、即使控件不可滑动,也有惯性缓冲效果(ps:如何触发——比如下拉到一定距离不放,往回滑动,即可看到效果),切换状态见NestedActivity

1.对所有基础控件(包括,嵌套滑动例如RecyclerView、NestedScrollView,普通的TextView、ListView、ScrollerView、webView、LinearLayout等)提供下拉刷新、上拉加载的支持 ,且实现无痕过度,和与其他库相比更真实的回弹效果((即使不是滑动控件)也有惯性缓冲效果)。

2.本库的主旨就是一切功能皆由header或者footer实现,所以你可以自定义header和footer(实现任何你想的到的功能,自动触发加载更多、固定头部、自动触发刷新(不弹出header)、二级刷新等),header和footer拽出方式默认8种(PLACEHOLDER、FOLLOW、PLACEHOLDER_FOLLOW、CENTER、PLACEHOLDER_CENTER、FOLLOW_CENTER、CENTER_FOLLOW、FOLLOW_PLACEHOLDER),动画可以onPullChange()完全自主设置。

ps:本库没有做解耦处理(那样会增加.class,大小也会增加),目的是使库足够小,而且本库功能目的明确,不必做无用功。

gradle Stable Version

compile 'com.yan:pullrefreshlayout:(↖)'

2.说明

支持所有基础控件

//-控件设置-
    refreshLayout.autoRefresh();// 自动刷新
    refreshLayout.autoRefresh(ture);// 自动刷新,同时是否触发刷新回调
    refreshLayout.autoLoading();// 自动加载
    refreshLayout.autoLoading(ture);// 自动加载,同时是否触发加载回调
    
    refreshLayout.setOverScrollDampingRatio(0.35f);//  值越大overscroll衰减越小(如何运作:overscroll移动偏移量*0.35) default 0.35F
    refreshLayout.setScrollInterpolator(interpolator);// 设置scroller的插值器
    refreshLayout.setAnimationMainInterpolator(interpolator);// 除了回弹其他所有动画的插值器 default ViscousInterpolator
    refreshLayout.setAnimationOverScrollInterpolator(interpolator);// 回弹动画的插值器 default ViscousInterpolator
            
    refreshLayout.setOverScrollMinDuring(int during);// 设置overscroll最小时间 default 60
    refreshLayout.setRefreshAnimationDuring(int refreshAnimationDuring);// 触发刷新或加载动画的执行时间 default 180
    refreshLayout.setResetAnimationDuring(int resetAnimationDuring);// 触发界面回复的动画执行时间 default 400
    refreshLayout.setDragDampingRatio(0.6f);// 阻尼系数(如何运作:移动偏移量*0.6) default 0.6F
    
    refreshLayout.setOverScrollAdjustValue(1f);// 用于控制overscroll时间 default 1f ,越大overscroll的时间越长
    refreshLayout.setTopOverScrollMaxTriggerOffset(300);// 用于控制顶部的overscroll的距离 default 65dp
    refreshLayout.setBottomOverScrollMaxTriggerOffset(300);// 用于控制底部overscroll的距离 default 65dp
    refreshLayout.setPullUpMaxDistance(300);// 用于控制向上移动的最大距离(大于等于0,为0可模拟禁用底部回弹) 默认 控件高度
    refreshLayout.setPullDownMaxDistance(300);// 用于控制向下移动的最大距离(大于等于0,为0可模拟禁用顶部回弹) 默认 控件高度

    refreshLayout.setRefreshEnable(false);// 下拉刷新是否可用 default true
    refreshLayout.setLoadMoreEnable(true);// 上拉加载是否可用 default false
    refreshLayout.setTwinkEnable(true);// 回弹是否可用 default true 
    refreshLayout.setAutoLoadingEnable(true);// 自动加载是否可用 default false
     
    // headerView和footerView需实现PullRefreshLayout.OnPullListener接口调整状态
    refreshLayout.setHeaderView(headerView);// 设置headerView
    refreshLayout.setFooterView(footerView);// 设置footerView
    
    refreshLayout.isTwinkEnable();// 是否开启回弹
    refreshLayout.isRefreshEnable();// 是否开启刷新
    refreshLayout.isLoadMoreEnable();// 是否开启加载更多
    
    refreshLayout.isDragMoveTrendDown();// 是否处于向下移动的趋势
    
    refreshLayout.isDragUp();// 是否正在向上拖拽
    refreshLayout.isDragDown();// 是否正在向下拖拽
    refreshLayout.isRefreshing();// 是否正在刷新
    refreshLayout.isLoading();// 是否正在加载
    refreshLayout.isOverScrollDown();// 是否正在向下越界回弹
    refreshLayout.isOverScrollUp();// 是否正在向上越界回弹
    
    refreshLayout.isDragVertical();// 是否开始纵向拖拽
    refreshLayout.isDragHorizontal();// 是否开始横向拖拽
    refreshLayout.isLayoutDragMoved();// 刷新控件是否移动
    
    refreshLayout.isLayoutMoving();// prl是否正在移动(也就是判断有没有动画正在执行)

    refreshLayout.isHoldingTrigger();// 是否已经触发刷新或加载
    refreshLayout.isHoldingFinishTrigger();// 是否已经触发刷新完毕或加载完毕
     
    refreshLayout.getMoveDistance();// 得到refreshlayout的移动距离
    refreshLayout.getRefreshTriggerDistance();// 得到下拉刷新的触发距离
    refreshLayout.getLoadingTriggerDistance();// 得到上拉加载的触发距离
    refreshLayout.getPullUpLimitDistance();// 得到向上拖拽最大范围(最大距离)
    refreshLayout.getPullDownLimitDistance();// 得到向下拖拽最大范围(最大距离)
    refreshLayout.getHeaderView();// 得到headerView
    refreshLayout.getFooterView();// 得到FooterView
    refreshLayout.getTargetView();// 得到TargetView
    
    refreshLayout.setRefreshTriggerDistance(200);// 设置下拉刷新触发位置,默认为header的高度  
    refreshLayout.setLoadTriggerDistance(200);// 设置上拉加载触发位置,默认为footer的高度  
    refreshLayout.setPullUpLimitDistance(400);// 向上拖拽最大范围,默认控件高度
    refreshLayout.setPullDownLimitDistance(400);// 向下拖拽最大范围,默认控件高度

    refreshLayout.setTargetView(nestedScrollView);// 设置目标view,可以改变滑动判断
   
    refreshLayout.setDispatchTouchAble(true);// 是否分发部所有事件 default true
    refreshLayout.setDispatchPullTouchAble(false);// 是否分发pullrefreshLayout的默认事件 default true
    refreshLayout.setDispatchChildrenEventAble(false);// 是否分发子View的默认事件 default true
    refreshLayout.setFooterFront(true);// 设置footer前置 default false
    refreshLayout.setHeaderFront(true);// 设置header前置 default false
    refreshLayout.setMoveWithFooter(true);// 设置footer跟随移动 default true
    refreshLayout.setMoveWithContent(true);// 设置直接子view跟随移动 default true
    refreshLayout.setMoveWithHeader(true);// 设置header跟随移动 default true
 
    refreshLayout.cancelAllAnimation();//取消所有正在执行的动画
    refreshLayout.cancelTouchEvent();//主动执行ACTION_CANCEL事件
  
    refreshLayout.moveChildren(0);// 移动子view
    
    refreshLayout.requestPullDisallowInterceptTouchEvent();// touch事件交给子View
   
    refreshLayout.setOnDragIntercept(PullRefreshLayout.OnDragIntercept);// 设置滑动判定 见 BEHAIVOR2
    public static class OnDragIntercept {
        public boolean onHeaderDownIntercept() {// header下拉之前的拦截事件
            return true;// true将拦截子view的滑动
        }
        public boolean onFooterUpIntercept() {// footer上拉之前的拦截事件
            return true;// true将拦截子view的滑动
        }
    }
    
    /**
    * 设置header或者footer的的出现方式,默认8种方式
    * FOLLOW,FOLLOW_PLACEHOLDER, PLACEHOLDER_FOLLOW
    * , FOLLOW_CENTER, PLACEHOLDER_CENTER
    * , CENTER, CENTER_FOLLOW
    * , PLACEHOLDER
    */
    refreshLayout.setRefreshShowGravity(RefreshShowHelper.CENTER,RefreshShowHelper.CENTER);
    refreshLayout.setHeaderShowGravity(RefreshShowHelper.CENTER)// header拽出方式
    refreshLayout.setFooterShowGravity(RefreshShowHelper.CENTER)// footer拽出方式
    // PullRefreshLayout.OnPullListener
        public interface OnPullListener {
            // 刷新或加载过程中位置相刷新或加载触发位置的百分比,时刻调用
            void onPullChange(float percent);
            void onPullReset();// 数据重置调用
            void onPullHoldTrigger();// 拖拽超过触发位置调用
            void onPullHoldUnTrigger();// 拖拽回到触发位置之前调用
            void onPullHolding(); // 正在刷新
            void onPullFinish();// 刷新完成
        }
         
    <!-- xml setting -->     
    <com.yan.pullrefreshlayout.PullRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
        app:prl_autoLoadingEnable="false"
        app:prl_dragDampingRatio="0.6"
        app:prl_resetAnimationDuring="400"
        app:prl_refreshAnimationDuring="180"
        app:prl_footerShowGravity="follow"
        app:prl_footerViewId="@layout/header_or_footer"
        app:prl_headerViewId="@layout/header_or_footer"
        app:prl_headerClass="com.yan.refreshloadlayouttest.widget.PlaceHolderHeader"
        app:prl_footerClass="com.yan.refreshloadlayouttest.widget.PlaceHolderHeader"
        app:prl_headerShowGravity="statePlaceholder"
        app:prl_loadMoreEnable="true"
        app:prl_loadTriggerDistance="70dp"
        app:prl_overScrollDampingRatio="0.2"
        app:prl_topOverScrollMaxTriggerOffset="65dp"
        app:prl_bottomOverScrollMaxTriggerOffset="70dp"
        app:prl_pullDownMaxDistance="150dp"
        app:prl_pullUpMaxDistance="250dp"
        app:prl_headerFront="true"
        app:prl_footerFront="true"
        app:prl_targetId="@+id/recyclerView"
        app:prl_refreshEnable="true"
        app:prl_refreshTriggerDistance="90dp"
        app:prl_overScrollAdjustValue="1"
        app:prl_twinkEnable="true">     
        
        <!-- 通过以下例子,你可以轻易实现recyclerView(任何View)的header,和数据错误、网络错误等的状态切换--> 
        <com.yan.pullrefreshlayout.PullRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:app="http://schemas.android.com/apk/res-auto"
            android:id="@+id/refreshLayout"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:prl_targetId="@+id/recyclerView">
        
            <!-- 包装层,实现了嵌套滑动的功能,也可以是普通的FrameLayout(实现机制不同) -->
            <com.yan.refreshloadlayouttest.widget.NestedFrameLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent">
        
                <!-- 数据添装 -->
                <androidx.recyclerview.widget.RecyclerView
                    android:id="@id/recyclerView"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:background="#f1f1f1"
                    android:overScrollMode="never" />
         
                <!-- header -->
                <androidx.cardview.widget.CardView
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content">
        
                    <TextView
                        android:layout_width="match_parent"
                        android:layout_height="46dp"
                        android:gravity="center"
                        android:text="header"
                        android:textSize="18sp" />
                </androidx.cardview.widget.CardView>
        
                <!-- 状态显示界面 -->
                <TextView
                    android:id="@+id/no_data"
                    android:background="#ffffff"
                    android:gravity="center"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:textColor="#212121"
                    android:textSize="20sp"
                    android:text="no data click to try again"  />
            </com.yan.refreshloadlayouttest.widget.NestedFrameLayout>
        
        </com.yan.pullrefreshlayout.PullRefreshLayout>

3.版本说明

version:1.7.3 : 事件切换优化
version:1.7.4 : 一直处于触摸状态下的,执行setTargetView()方法,增加cancel掉事件
version:1.7.5 : 修复事件状态错误问题
version:1.7.8 : 调整由于onStartNestedScroll()先于onNestedPreFling()执行的二次handleAction
version:1.8.5 : 优化flingBack效果


version:2.0.0 : 新增SwipeRefreshLayout效果,优化
version:2.0.2 : 新增viewpager实例
version:2.0.3 : dragState 状态调整

version:2.0.5 : 使用粘性插值器
version:2.0.7 : 调整回弹插值器为线性插值器,回弹效果基本与qq一致
version:2.0.9 : 多点触控调整
version:2.0.10 : insert methods getHeaderView(),getFooterView),getTargetView()
version:2.1.0 : detail adjust
version:2.2.1 :add method autoRefresh(int toRefreshDistance),autoLoading(int toLoadDistance)
version:2.2.2 :修复回调时机错误问题
version:2.2.4 :剔除反射部分,恢复header划出的原本处理
version:2.2.5 :增加isTargetScrollUpAble和isTargetScrollDownAble拦截监听
version:2.2.6 :fix issue #25
version:2.2.7 :增强滑动体验
version:3.x :androidx
version:3.0.1 :主动分发的事件,主动回收

4.问题 FAQ(对于本库的使用有问题,都可以在github上提issue,本人重度github控,一天最最少半小时泡在github上)

1.VLayout 设置悬浮后,不可下拉(问题可见https://github.com/alibaba/vlayout/blob/master/docs/VLayoutFAQ.md)
官方描述如下:
下拉刷新,有很多框架是通过判断 RecyclerView 的第一个 view 的 top 是否为 0 来触发下拉动作。VLayout 里在处理背景、悬浮态的时候加入了一些对 LayoutManager 不可见的 View,但又真实存在与 RecyclerView 的视图树里,建议使用 layoutManager.getChildAt(0) 来获取第一个 view。

解决办法:可复写刷新判断

    @Override
    public boolean isTargetScrollUpAble() {
          ...  


友情提示: ( 来自pjh520的的提点 )如果你使用了scrollView,它的直接子View请不要设置纵向的margin会影响滑动判断,这点也是刷新库的通病。。。

5.demo用到的库

loading 动画
AVLoadingIndicatorView(https://github.com/81813780/AVLoadingIndicatorView)

LICENSE

Copyright 2017 yan

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

pullrefreshlayout's People

Contributors

genius158 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

pullrefreshlayout's Issues

PullRefreshLayout里面放置Listview后使用ClassicHoldLoadView可以实现自动加载更多吗?貌似里面只有NestedScrollView和RecyclerView? 求教一下

private void scrollInit() {
post(new Runnable() {
@OverRide
public void run() {
final View target = refreshLayout.getTargetView();
refreshLayout.setLoadTriggerDistance(tv.getHeight());
target.setOverScrollMode(OVER_SCROLL_NEVER);
((ViewGroup) target).setClipToPadding(false);

            if (target instanceof NestedScrollView) {
                ((NestedScrollView) target).setOnScrollChangeListener(new NestedScrollView.OnScrollChangeListener() {
                    @Override
                    public void onScrollChange(NestedScrollView v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
                        if (refreshLayout.isRefreshing()) {
                            return;
                        }
                        setTargetTranslationY();
                    }
                });
            }
            else if (target instanceof RecyclerView) {
                ((RecyclerView) target).addOnScrollListener(new RecyclerView.OnScrollListener() {
                    @Override
                    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                        if (refreshLayout.isRefreshing()) {
                            return;
                        }
                        setTargetTranslationY();
                    }
                });
            }

            setTargetTranslationY();
        }
    });
}

虚假广告

你知道满怀期待兴奋,以为真的有人做出来很接近QQ的回弹效果的控件,运行之后,满满的失望的心情吗?你敢再牛B吹的再大点吗?

单纯回弹模块common_activity4.xml 36 38 50 52 行, 这里改一下就丢失回弹效果,是不是跟layout_weight 有关?

单纯回弹模块common_activity4.xml 的第 36 38 50 52 行, 这里改一下就就丢失回弹效果,是不是跟layout_weight 有关?
类似这种
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="0.3"

        android:id="@+id/refreshLayout2"
        android:overScrollMode="never"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="0.7"

感谢楼主提供了这么轻量级的刷新库

开源的刷新库基本都用过,感觉实际上需要的还是个轻量级的,正好找到这个!发现个问题就是,上拉刷新完成时。footer有动画下滑,这个能取消吗?

支付宝那个演示,支付宝刷新高度是固定,演示却没有,能固定吗?

控件显示问题

3
didi_head 布局改成layout_height =wrap_conent,显示成
1
改成固定的layout_height为固定值375dp 显示成
2
这要如何处理

用该布局实现会发现有事件冲突,CoordinatorLayout,是不是没有做事件处理?

实现不了悬停效果。
`

<LinearLayout
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:background="#30469b"
    android:orientation="vertical"></LinearLayout>

<com.yan.pullrefreshlayout.PullRefreshLayout
    android:id="@+id/parl"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">


    <android.support.design.widget.CoordinatorLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".frame.tabactivity.CoordinatorActivity">

        <android.support.design.widget.AppBarLayout
            android:id="@+id/appbarlayout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:theme="@style/AppTheme.AppBarOverlay">

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="150dp"
                android:background="#fff"
                app:layout_scrollFlags="scroll">

            </LinearLayout>

            <android.support.design.widget.TabLayout
                android:id="@+id/tablayout"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="#c0f9d0"
                app:tabGravity="center"
                app:tabIndicatorColor="@color/colorAccent"
                app:tabMode="scrollable"
                app:tabSelectedTextColor="@color/colorPrimaryDark"
                app:tabTextColor="@color/colorPrimary" />


        </android.support.design.widget.AppBarLayout>

        <android.support.v4.view.ViewPager
            android:id="@+id/viewPager"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:layout_behavior="@string/appbar_scrolling_view_behavior" />

    </android.support.design.widget.CoordinatorLayout>
</com.yan.pullrefreshlayout.PullRefreshLayout>

`

使用单纯的回弹实现仿IOS回弹效果有点问题

下拉回弹的时候下拉到一定距离松手后开始执行回弹动画,正在执行动画期间如果再次进行下拉,动画停止执行,并且内部的View无法跟随手指继续下滑,上拉的时候拉动到一定距离松手后,开始执行回弹动画,如果再次上拉,回弹动画停止执行了,但是View也不会跟随手指继续上滑动,试了试Demo也是有这个问题,Demo里边的那个单纯的回弹案例 里边左边是ListView 右边是RecyclerView ListView貌似没有这个问题,RecyclerView有这个问题,我也是包裹的RecyclerView,就会无法滑动

如何主动关闭二楼

作者框架很好, 很轻量和很大扩展性, 在用你的框架实现类似微信首页下拉显示小程序窗口, 基本功能已经上线 下拉展开上拉关闭, 都没问题, 目前项目需求要在二楼加一个按钮 主动关闭二楼, 我试着调用 refreshComplete() 方法 页面倒是恢复了 不过无法在触发下拉状态, 我debug了一下 看是在refreshComplete后再次下拉后状态一直是正在刷新 无法触发再次刷新, 请问有什么解决办法呢 3Q

你好,关于demo中仿支付宝的刷新效果,有个问题想请教一下

我仿照demo自己写了一个页面,但是有一个问题,当我的header部分是一个listview的情况时(listview高度会自适应,重写了onMeasure),而我的listview是从网络中获取得数据,那么这种情况下,我的内容区域会飘在header的中间部分,我觉得是没有重新计算header的宽高,请问这部分有解决方法吗,谢谢

autoRefresh(false)不生效

下拉刷新后触发了刷新行为,UI的刷新状态由viewModel中的LiveData控制,这时候会再次调用autoRefresh(false)去将试图置为刷新状态,由于下方代码导致false无效而产生无限回调

if (headerCurrentDistance == refreshTriggerHeight) {
refreshStartAnimationListener.onAnimationEnd(null);
return;
}
if (startRefreshAnimator == null) {
startRefreshAnimator =
getAnimator(headerCurrentDistance, refreshTriggerHeight, headerAnimationUpdate,
refreshStartAnimationListener, readyMainInterpolator());
} else {
startRefreshAnimator.setIntValues(headerCurrentDistance, refreshTriggerHeight);
}
refreshWithAction = withAction;
startRefreshAnimator.setDuration(refreshAnimationDuring);
startRefreshAnimator.start();

在refreshWithAction赋值前进行了回调

关于首页上拉不能没有回弹效果

在测试中发现,如果PullRefreshLayout嵌套的linearlayout中的子view总的高度超过一个屏幕的高度,那么上拉回弹效果将不会出现,如果有此类需求,有什么好的解决方案吗?

触摸事件处理有BUG

当刷新视图已经展开停留(刷新停留),如果给内部视图设置了长按监听,这个时候向上拖动内部视图会触发长按监听,应该是传递后的坐标一直没有怎么变化,导致触发了长按监听。如果是向下拖动是没问题的,传递后的坐标有增长所以不会触发长按监听。作者可以考虑处理下这种场景。

Fragment中使用该刷新控件

Fragment中使用该刷新控件,内嵌套LinearLayout, LinearLayout内再嵌套ListView和RelativeLayout
我想使用ListView 的setEmptyView方法将RelativeLayout作为EmptyView
但是上拉和下拉显示的效果有问题
然而该布局在Activity使用时没问题(不排除其他可能 只是暂时出现这样的现象)

子元素为WebView, 无法进行下拉刷新

大佬,求助。

 <com.tencent.cloud.uikit.widget.pullrefreshlayout.PullRefreshLayout
        android:id="@+id/prl_pull_refresh_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:overScrollFooter="@android:color/transparent"
        android:overScrollHeader="@android:color/transparent"
        android:overScrollMode="never"
        android:scrollbars="none"
        app:prl_end_text_no_more="@string/no_more_text"
        app:prl_footerViewId="@layout/com_pull_refresh_root"
        app:prl_headerViewId="@layout/com_pull_refresh_head"
        app:prl_pullDownMaxDistance="80dp"
        app:prl_pullUpMaxDistance="80dp"
        tools:ignore="ResourceName">


        <com.tencent.cloud.uikit.widget.webview.BaseWebView
            android:id="@+id/web_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:overScrollMode="never"
            android:scrollbars="none" />


    </com.tencent.cloud.uikit.widget.pullrefreshlayout.PullRefreshLayout>

上拉加载更多的footer中TextView不居中

PullRefreshLayout包裹的ScrollView中
setFooterView为demo中的ClassicLoadView的修改版
删除了ClassicLoadView中的AVLoadingIndicatorView,只保留了TextView
布局如下:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:id="@+id/rl_container"
    android:layout_height="wrap_content">

    <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="60dp"
        android:layout_marginLeft="150dp"
        android:ellipsize="end"
        android:gravity="center"
        android:text="loading..."
        android:textColor="@color/colorPrimary"
        android:textSize="16sp" />
</FrameLayout> 

出现的问题是:
该TextView所显示的文字不居中

CoordinatorLayout包裹ViewPager事件冲突

<com.yan.pullrefreshlayout.PullRefreshLayout 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:id="@+id/refreshLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:prl_headerShowGravity="follow"
app:prl_twinkEnable="false">

<android.support.design.widget.CoordinatorLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.design.widget.AppBarLayout
        android:id="@+id/appBarLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:elevation="0dp">


        <android.support.design.widget.CollapsingToolbarLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:layout_scrollFlags="scroll|exitUntilCollapsed">

            <include layout="@layout/header_deal_home" />

            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:paddingStart="0dp"
                android:paddingEnd="0dp"
                app:contentInsetStart="0dp"
                app:layout_anchor="@id/placeholder"
                app:layout_anchorGravity="center"
                app:layout_collapseMode="pin">


                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:gravity="center_vertical"
                    android:orientation="horizontal">

                    <TextView
                        android:id="@+id/tv_search"
                        android:layout_width="0dp"
                        android:layout_height="34dp"
                        android:layout_marginStart="@dimen/margin_medium"
                        android:layout_marginTop="16dp"
                        android:layout_marginBottom="16dp"
                        android:layout_weight="1"
                        android:background="@drawable/shape_white_oval"
                        android:drawableEnd="@drawable/icon_main_search"
                        android:drawablePadding="7dp"
                        android:gravity="center_vertical"
                        android:paddingStart="@dimen/margin_medium"
                        android:paddingEnd="@dimen/margin_medium"
                        android:text="搜索所需内容,如抖音粉丝,头条号"
                        android:textColor="@color/color_5B6285"
                        android:textSize="12sp"
                        android:visibility="invisible"
                        tools:visibility="visible" />

                    <ImageView
                        android:id="@+id/iv_issuedeal"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:padding="@dimen/margin_medium"
                        android:src="@drawable/icon_deal_home_issue" />

                </LinearLayout>

            </android.support.v7.widget.Toolbar>

        </android.support.design.widget.CollapsingToolbarLayout>

        <FrameLayout
            android:id="@+id/fl_tab"
            android:layout_width="match_parent"
            android:layout_height="60dp">

            <com.flyco.tablayout.SlidingTabLayout
                android:id="@+id/pss_tab"
                android:layout_width="match_parent"
                android:layout_height="60dp"
                android:background="@drawable/pic_home_switchbg"
                android:paddingTop="10dp"
                app:tl_indicator_color="@color/colorAccent"
                app:tl_indicator_corner_radius="3dp"
                app:tl_indicator_height="3dp"
                app:tl_indicator_margin_bottom="7dp"
                app:tl_indicator_width="25dp"
                app:tl_tab_space_equal="true"
                app:tl_textBold="BOTH"
                app:tl_textSelectColor="@color/text_color_333"
                app:tl_textUnselectColor="@color/color_989CB3"
                app:tl_textsize="17sp" />

        </FrameLayout>

    </android.support.design.widget.AppBarLayout>

    <android.support.v4.view.ViewPager
        android:id="@+id/viewPager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior" />

    <ViewStub
        android:id="@+id/vs_gift"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_gravity="bottom|end"
        android:layout_marginEnd="10dp"
        android:layout_marginBottom="10dp"
        android:layout="@layout/pop_novice_gift" />

</android.support.design.widget.CoordinatorLayout>

</com.yan.pullrefreshlayout.PullRefreshLayout>

关于仿支付宝下拉的问题

小哥你好,我现在实现了仿支付宝首页的下拉刷新效果,但是发现该项目中recyclerview有默认回弹效果(就是拉到底依然可以上拉防守回弹),现在我想屏蔽这个效果,prl.setMoveWithFooter(false);prl.setMoveWithHeader(false);这两个方法不管用,prl.setMoveWithContent(false);就直接没有了仿支付宝首页下拉刷新的效果,请指教有什么方法。还有一个问题,下方的recyclerview条目的第一个点击事件消失了

滑动监听如何设置

您好
查看源码并尝试在dellScroll(float distanceY)中监听tempDistance
发现数据只有在真实滑动时有效 但在控件回弹滑动中并无调用 请问本项目的滑动监听应该如何写?

【建议】上拉和下拉时碰到的小尴尬

就这样使用的时候发现设置了之后还是能够上拉与下拉。

refreshLayout.setRefreshEnable(false);
refreshLayout.setLoadMoreEnable(false);

我开始以为是我的问题,然后在你的 demo 中试了下也不行。

public class NestedFragment extends Fragment {
    ……
    private void initRefreshLayout(View container) {
        refreshLayout = (PullRefreshLayout) container.findViewById(R.id.refreshLayout);

        refreshLayout.setLoadTriggerDistance((int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 60, getResources().getDisplayMetrics()));
        refreshLayout.setFooterView(classicLoadView = new ClassicHoldLoadView(getContext(), refreshLayout));
        refreshLayout.setOnRefreshListener(……);
        //在这使用
        refreshLayout.setRefreshEnable(false);
        refreshLayout.setLoadMoreEnable(false);
    }
}

查看你的代码,发现了如果 pullTwinkEnable 是 true ,不管上下拉是否为 false,那么还是能够上下拉,如果我设置为 false ,那么上拉下拉就禁止了。

我感觉你的思路是:
可以单纯设置允许上下拉,不触发加载。
(setTwinkEnable = true , setRefreshEnable = false, setLoadMoreEnable = false)
也可以设置为上下拉并加载 
( 都为 true )
或者设置为禁止上下拉 
( 都为 false )

如果按这样的话,我试了上下拉不触发加载的情况,上拉加载更多仍然触发加载,下拉刷新不触发刷新 …… 感觉上拉下拉被区别对待了,不太统一。

个人第一次看到 setEnable 这种感觉应该是总开关,没想到还要 setTwinkEnable 才能关 ……
如果老哥下次还要写控件的话,能不能开关只写一个。😂

没有更多数据

请问下,没有更多数据的时候,上拉的生活footer能否隐藏不显示,谢谢

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.