Android智能下拉刷新框架-SmartRefreshLayout

Overview

Android智能下拉刷新框架-SmartRefreshLayout

License Arsenal Maven MinSdk Methods

English | 中文

SmartRefreshLayout以打造一个强大,稳定,成熟的下拉刷新框架为目标,并集成各种的炫酷、多样、实用、美观的Header和Footer。 正如名字所说,SmartRefreshLayout是一个“聪明”或者“智能”的下拉刷新布局,由于它的“智能”,它不只是支持所有的View,还支持多层嵌套的视图结构。 它继承自ViewGroup 而不是FrameLayout或LinearLayout,提高了性能。 也吸取了现在流行的各种刷新布局的优点,包括谷歌官方的 SwipeRefreshLayout, 其他第三方的 Ultra-Pull-To-RefreshTwinklingRefreshLayout 。 还集成了各种炫酷的 Header 和 Footer。

国内加速

github 由于你懂的原因,下载速度缓慢,图片也无法查看,可以跳转 国内镜像

特点功能:

  • 支持多点触摸
  • 支持淘宝二楼和二级刷新
  • 支持嵌套多层的视图结构 Layout (LinearLayout,FrameLayout...)
  • 支持所有的 View(AbsListView、RecyclerView、WebView....View)
  • 支持自定义并且已经集成了很多炫酷的 Header 和 Footer.
  • 支持和 ListView 的无缝同步滚动 和 CoordinatorLayout 的嵌套滚动 .
  • 支持自动刷新、自动上拉加载(自动检测列表惯性滚动到底部,而不用手动上拉).
  • 支持自定义回弹动画的插值器,实现各种炫酷的动画效果.
  • 支持设置主题来适配任何场景的 App,不会出现炫酷但很尴尬的情况.
  • 支持设多种滑动方式:平移、拉伸、背后固定、顶层固定、全屏
  • 支持所有可滚动视图的越界回弹
  • 支持 Header 和 Footer 交换混用
  • 支持 AndroidX
  • 支持横向刷新

传送门

Demo

下载 APK-Demo

项目演示

个人首页 微博列表
餐饮美食 个人中心

样式演示 Style

Delivery DropBox
Refresh-your-delivery Dropbox-Refresh

上面这两个是我自己实现的,下面的是我把github上其它优秀的Header进行的整理和集合还有优化:

BezierRadar BezierCircle
Pull To Refresh Pull Down To Refresh
FlyRefresh Classics
FlyRefresh ClassicsHeader
Phoenix Taurus
Yalantis/Phoenix Yalantis/Taurus
BattleCity HitBlock
FunGame/BattleCity FunGame/HitBlock
WaveSwipe Material
WaveSwipeRefreshLayout MaterialHeader
StoreHouse WaterDrop
CRefreshLayout WaterDrop

看到这么多炫酷的Header,是不是觉得很棒?这时你或许会担心这么多的Header集成在一起,但是平时只会用到一个,是不是要引入很多无用的代码和资源? V2.x 版本已经把依赖库拆分成8个包啦,用到的时候自行引用就可以啦!

  • refresh-layout-kernel 核心必须依赖
  • refresh-header-classics 经典刷新头
  • refresh-header-radar 雷达刷新头
  • refresh-header-falsify 虚拟刷新头
  • refresh-header-material 谷歌刷新头
  • refresh-header-two-level 二级刷新头
  • refresh-footer-ball 球脉冲加载
  • refresh-footer-classics 经典加载

简单用例

1.在 build.gradle 中添加依赖

implementation 'androidx.appcompat:appcompat:1.0.0'                 //必须 1.0.0 以上

implementation  'io.github.scwang90:refresh-layout-kernel:2.0.3'      //核心必须依赖
implementation  'io.github.scwang90:refresh-header-classics:2.0.3'    //经典刷新头
implementation  'io.github.scwang90:refresh-header-radar:2.0.3'       //雷达刷新头
implementation  'io.github.scwang90:refresh-header-falsify:2.0.3'     //虚拟刷新头
implementation  'io.github.scwang90:refresh-header-material:2.0.3'    //谷歌刷新头
implementation  'io.github.scwang90:refresh-header-two-level:2.0.3'   //二级刷新头
implementation  'io.github.scwang90:refresh-footer-ball:2.0.3'        //球脉冲加载
implementation  'io.github.scwang90:refresh-footer-classics:2.0.3'    //经典加载

如果使用 AndroidX 先在 gradle.properties 中添加,两行都不能少噢~

android.useAndroidX=true
android.enableJetifier=true

2.在XML布局文件中添加 SmartRefreshLayout

">
xml version="1.0" encoding="utf-8"?>
<com.scwang.smart.refresh.layout.SmartRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/refreshLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <com.scwang.smart.refresh.header.ClassicsHeader
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:overScrollMode="never"
        android:background="#fff" />
    <com.scwang.smart.refresh.footer.ClassicsFooter
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
com.scwang.smart.refresh.layout.SmartRefreshLayout>

3.在 Activity 或者 Fragment 中添加代码

RefreshLayout refreshLayout = (RefreshLayout)findViewById(R.id.refreshLayout);
refreshLayout.setRefreshHeader(new ClassicsHeader(this));
refreshLayout.setRefreshFooter(new ClassicsFooter(this));
refreshLayout.setOnRefreshListener(new OnRefreshListener() {
    @Override
    public void onRefresh(RefreshLayout refreshlayout) {
        refreshlayout.finishRefresh(2000/*,false*/);//传入false表示刷新失败
    }
});
refreshLayout.setOnLoadMoreListener(new OnLoadMoreListener() {
    @Override
    public void onLoadMore(RefreshLayout refreshlayout) {
        refreshlayout.finishLoadMore(2000/*,false*/);//传入false表示加载失败
    }
});

使用指定的 Header 和 Footer

1.方法一 全局设置

public class App extends Application {
    //static 代码段可以防止内存泄露
    static {
        //设置全局的Header构建器
        SmartRefreshLayout.setDefaultRefreshHeaderCreator(new DefaultRefreshHeaderCreator() {
                @Override
                public RefreshHeader createRefreshHeader(Context context, RefreshLayout layout) {
                    layout.setPrimaryColorsId(R.color.colorPrimary, android.R.color.white);//全局设置主题颜色
                    return new ClassicsHeader(context);//.setTimeFormat(new DynamicTimeFormat("更新于 %s"));//指定为经典Header,默认是 贝塞尔雷达Header
                }
            });
        //设置全局的Footer构建器
        SmartRefreshLayout.setDefaultRefreshFooterCreator(new DefaultRefreshFooterCreator() {
                @Override
                public RefreshFooter createRefreshFooter(Context context, RefreshLayout layout) {
                    //指定为经典Footer,默认是 BallPulseFooter
                    return new ClassicsFooter(context).setDrawableSize(20);
                }
            });
    }
}

注意:方法一 设置的Header和Footer的优先级是最低的,如果同时还使用了方法二、三,将会被其它方法取代

2.方法二 XML布局文件指定

">
<com.scwang.smart.refresh.layout.SmartRefreshLayout
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/refreshLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#444444"
    app:srlPrimaryColor="#444444"
    app:srlAccentColor="@android:color/white"
    app:srlEnablePreviewInEditMode="true">
    
    
    <com.scwang.smart.refresh.header.ClassicsHeader
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:padding="@dimen/dimenPaddingCommon"
        android:background="@android:color/white"
        android:text="@string/description_define_in_xml"/>
    <com.scwang.smart.refresh.footer.ClassicsFooter
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
com.scwang.smart.refresh.layout.SmartRefreshLayout>

注意:方法二 XML设置的Header和Footer的优先级是中等的,会被方法三覆盖。而且使用本方法的时候,Android Studio 会有预览效果,如下图:

不过不用担心,只是预览效果,运行的时候只有下拉才会出现~

3.方法三 Java代码设置

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));

4.更多使用说明

混淆

SmartRefreshLayout 不需要添加混淆过滤代码,并且已经混淆测试通过,如果你在项目的使用中混淆之后出现问题,请及时通知我。

赞赏

如果你喜欢 SmartRefreshLayout 的设计,感觉 SmartRefreshLayout 帮助到了你,可以点右上角 "Star" 支持一下 谢谢! ^_^ 你也还可以扫描下面的二维码~ 请作者喝一杯咖啡。

如果希望捐赠之后能获得相关的帮助,可以选择加入下面的付费群来取代普通捐赠,付费群可以直接获得作者的直接帮助,与问题反馈。

如果在捐赠留言中备注名称,将会被记录到列表中~ 如果你也是github开源作者,捐赠时可以留下github项目地址或者个人主页地址,链接将会被添加到列表中起到互相推广的作用 捐赠列表

友情链接

github/afKT/DevUtils
github/Loror
github/faith-hb/WidgetCase
github/Bamboy120315/Freedom
github/TommyLemon/APIJSON
github/dengyuhan
github/zrp2017
github/fly803/BaseProject
github/razerdp
github/SuperChenC/s-mvp
github/KingJA/LoadSir
github/jianshijiuyou
github/zxy198717
github/addappcn
github/RainliFu
github/sugarya
github/stormzhang

讨论

QQ解决群 - 602537182 (付费)

进群须知

自开群以来,还是有很多的朋友提出了很多问题,我也解决了很多问题,其中有大半问题是本库的Bug导致,也有些是使用者项目本 身的环境问题,这花费了我大量的时间,经过我的观察和测试,到目前为止,本库的bug已经越来越少,当然不能说完全没有,但是 已经能满足很大部分项目的需求。所以从现在起,我做出一个决定:把之前的讨论群改成解决群,并开启付费入群功能,专为解决大 家在使用本库时遇到的问题,不管是本库bug还是,特殊的项目环境导致(包含项目本身的bug)。 我也有自己的工作和娱乐时间,只有大家理解和支持我,我才能专心的为大家解决问题。不过用担心,我已经建立了另一个可以免费 进入的QQ讨论群。

QQ讨论群 - 914275312 (新) 477963933 (满) 538979188 (满)

进群须知

这个群,免费进入,大家可以相互讨论本库的相关使用和出现的问题,群主也会在里面解决问题,如果提出的问题,群成员不能帮助 解决,需要群主解决,但是要花费群主五分钟以上的时间(本库Bug除外),群主将不会解决这个问题,如果项目紧急,请付费进入解 决群解决(不过注意,付费群中群主会很认真很努力的解决问题,但也不能保证已经能完美解决)或者转换使用其他的刷新库。

温馨提示

加入群的答案在本文档中可以找到~

其他作品

MultiWaveHeader
SmartRefreshHorizontal
诗和远方

感谢

SwipeRefreshLayout
Ultra-Pull-To-Refresh
TwinklingRefreshLayout
BeautifulRefreshLayout

License

Copyright 2017 scwang90

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.
Comments
  • 遇到内存泄露问题,请看详情!

    遇到内存泄露问题,请看详情!

    版本号:1.0.3-alpha-3(之前的版本也遇到过) 使用代码: //----------------------------------------------------------------- private void initRefreshLayout() { mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); mRecyclerView .addItemDecoration(new RecyclerViewDivider(getContext(), DividerItemDecoration.VERTICAL));

    mRecyclerView.setItemAnimator(new DefaultItemAnimator());
    mRecyclerView
        .setAdapter(mAdapter = new BaseRecyclerAdapter<CourseReply>(mList,
            R.layout.adapter_item_course_reply) {
          @Override
          protected void onBindViewHolder(SmartViewHolder holder, CourseReply model, int position) {
            holder.text(R.id.reply_content, model.getContent());
            holder.text(R.id.reply_time, model.getCreateTime());
            ((RatingBar) holder.findViewById(R.id.rating_reply))
                .setRating((float) model.getOverallScore());
            holder.text(R.id.reply_name, model.getCreateUserName());
            if (!TextUtils.isEmpty(String.valueOf(model.getCreateUserId()))) {
              String headUri = ConstsData.HOST + "/common/head/"
                  + model.getCreateUserId() + "/100";
              GlideUtils.loadUserAvatar(getActivity(), headUri,
                  (CircleImageView) holder.findViewById(R.id.reply_avatar));
            }
          }
        });
    mRefreshLayout.setRefreshHeader(new MaterialHeader(getActivity()));
    mRefreshLayout.setRefreshFooter(new BallPulseFooter(getActivity()));
    mRefreshLayout.setEnableHeaderTranslationContent(false);
    mRefreshLayout.setOnRefreshListener(new OnRefreshListener() {
      @Override
      public void onRefresh(RefreshLayout refreshlayout) {
        mRefreshLayout.setLoadmoreFinished(false);
        curPageIndex = 1;
        httpCommentList();
      }
    });
    mRefreshLayout.setOnLoadmoreListener(new OnLoadmoreListener() {
      @Override
      public void onLoadmore(RefreshLayout refreshlayout) {
        curPageIndex += 1;
        httpCommentList();
    
      }
    });
    

    } //----------------------------------------------------------------- 全局配置header和footer也会遇到内存泄漏,请问大佬我写的代码有问题吗?

    opened by ijoncc 13
  • NestLayout 滑动效果不是太流畅

    NestLayout 滑动效果不是太流畅

    <com.scwang.smartrefresh.layout.SmartRefreshLayout> <com.scwang.smartrefresh.layout.header.ClassicsHeader> <android.support.v4.widget.NestedScrollView> <android.support.v7.widget.RecyclerView> <android.support.v4.widget.NestedScrollView> <com.scwang.smartrefresh.layout.footer.ClassicsFooter> <com.scwang.smartrefresh.layout.SmartRefreshLayout>

    我的布局大概是这个结构,滑动不是太流畅,无法快速滑动。能麻烦你看下吗?

    opened by lizhw123 12
  • 在fragment中与CoordinatorLayout结合

    在fragment中与CoordinatorLayout结合

    如题,下面一种布局,当在fragment中和Activity中表现不一致。在fragment中,完全不能滑动,不只是不能下拉刷新,连recyclerView都不能滑动了,但是在Activity中却不存在这个情况。

    <android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <android.support.design.widget.AppBarLayout
          省略 没有影响
        </android.support.design.widget.AppBarLayout>
    
        <am.widget.stateframelayout.StateFrameLayout
            android:id="@+id/base_state_layout"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_behavior="@string/appbar_scrolling_view_behavior"
            app:sflState="loading">
            <com.scwang.smartrefresh.layout.SmartRefreshLayout
                android:id="@+id/base_fragment_data_refresh"
                android:id="@+id/base_fragment_data_refresh"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                app:srlEnableNestedScrolling="true">
    
                <android.support.v7.widget.RecyclerView
                    android:id="@+id/base_fragment_data_list"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:overScrollMode="never" />
            </com.scwang.smartrefresh.layout.SmartRefreshLayout>
        </am.widget.stateframelayout.StateFrameLayout>
    </android.support.design.widget.CoordinatorLayout>
    

    如果把StateFrameLayout布局替换成 NestedScrollView,在fragment中就能滑动了。 但是,之前是使用的TwinklingRefreshLayout,把他更换回来,同样的布局,却没有这个情况。初步,查看代码,应该是NestedScroll机制没有兼容好,但是具体问题在那,还没发现,反馈给作者。

    opened by zengcanxiang 11
  • SmartRefreshLayout+CoordinatorLayout+CollapsingToolbarLayout下拉有问题,折叠的下拉会显示不全或不显示

    SmartRefreshLayout+CoordinatorLayout+CollapsingToolbarLayout下拉有问题,折叠的下拉会显示不全或不显示

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        style="@style/AppTheme.Toolbar"
        app:navigationIcon="@drawable/ic_arrow_back_white_24dp"
        app:title="@string/title_activity_practice_feedlist"/>
    
    <com.scwang.smartrefresh.layout.SmartRefreshLayout
        android:id="@+id/smartLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:srlAccentColor="#fff"
        app:srlEnablePreviewInEditMode="false"
        app:srlFixedHeaderViewId="@+id/profile"
        app:srlPrimaryColor="#444">
    
        <com.scwang.smartrefresh.layout.header.ClassicsHeader
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            />
    
        <android.support.design.widget.CoordinatorLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent">
    
            <android.support.design.widget.AppBarLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                >
    
                <android.support.design.widget.CollapsingToolbarLayout
                    android:id="@+id/toolbarlayout"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    app:layout_scrollFlags="scroll|exitUntilCollapsed">
    
                    <RelativeLayout
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        app:layout_collapseMode="parallax">
    
                        <TextView
                            android:layout_width="match_parent"
                            android:layout_height="350dp"
                            android:text="上边消失的"/>
                    </RelativeLayout>
    
                </android.support.design.widget.CollapsingToolbarLayout>
            </android.support.design.widget.AppBarLayout>
    
            <android.support.v4.widget.NestedScrollView
                android:id="@+id/nsv_ftc"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                app:layout_behavior="@string/appbar_scrolling_view_behavior">
    
                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:orientation="vertical">
    
    
                    <TextView
                        android:layout_width="match_parent"
                        android:layout_height="200dp"
                        android:background="#99ffffff"
                        android:text="11111111"/>
    
                    <TextView
                        android:layout_width="match_parent"
                        android:layout_height="300dp"
                        android:background="#66ffffff"
                        android:text="22222"/>
    
                    <TextView
                        android:layout_width="match_parent"
                        android:layout_height="400dp"
                        android:background="#11ffffff"
                        android:text="333333"/>
    
                    <TextView
                        android:layout_width="match_parent"
                        android:layout_height="500dp"
                        android:background="#44ffffff"
                        android:text="44444"/>
    
                    <TextView
                        android:layout_width="match_parent"
                        android:layout_height="600dp"
                        android:background="#77ffffff"
                        android:text="55555"/>
                </LinearLayout>
            </android.support.v4.widget.NestedScrollView>
        </android.support.design.widget.CoordinatorLayout>
    
        <com.scwang.smartrefresh.layout.footer.ClassicsFooter
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            />
    </com.scwang.smartrefresh.layout.SmartRefreshLayout>
    
    opened by Equalzys 11
  • 上拉加载更多的问题

    上拉加载更多的问题

    版本是 1.1.0

    <com.scwang.smartrefresh.layout.SmartRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/refreshLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <com.scwang.smartrefresh.layout.header.ClassicsHeader
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    
        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/rv"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:paddingStart="6dp"
            android:paddingTop="6dp"
            android:paddingEnd="6dp" />
    
        <com.scwang.smartrefresh.layout.footer.ClassicsFooter
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    
    </com.scwang.smartrefresh.layout.SmartRefreshLayout>
    

    在上拉加载更多的时候,列表会立马返回当前页顶部,然后才会走 setOnLoadMoreListener 里的 onLoadMore

    比如当前页是0,然后往上滑,滑动到底部后,列表会立马跑到0页的顶部,然后调用加载更多。

    加载完后,继续上滑,滑动到1页的底部后,列表会立马跑到1页的顶部,然后调用加载更多,以此类推。

    opened by WANZIzZ 10
  • 如下布局,NestedScrollView嵌套SmartRefreshLayout,导致两个问题:1、无法惯性滑动到底部加载更多 2、手动上拉加载后,再次下拉刷新阻力很大。

    如下布局,NestedScrollView嵌套SmartRefreshLayout,导致两个问题:1、无法惯性滑动到底部加载更多 2、手动上拉加载后,再次下拉刷新阻力很大。

    <androidx.core.widget.NestedScrollView android:id="@+id/mNetView" android:fillViewport="true" android:focusableInTouchMode="true" android:focusable="true" android:layout_width="match_parent" android:layout_height="match_parent">

        <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@color/white"
            android:orientation="vertical">
            <FrameLayout
                android:layout_width="match_parent"
                android:layout_height="138dp">
                <ImageView
                    android:id="@+id/imageView"
                    android:layout_width="match_parent"
                    android:layout_height="118dp"/>
            </FrameLayout>
            <com.scwang.smartrefresh.layout.SmartRefreshLayout
                android:layout_marginTop="95dp"
                android:id="@+id/swipeRefreshLayout"
                android:layout_width="match_parent"
                android:layout_height="match_parent">
    
                <androidx.recyclerview.widget.RecyclerView
                    android:id="@+id/mRecyclerView"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"/>
            </com.scwang.smartrefresh.layout.SmartRefreshLayout>
        </FrameLayout>
    
    </androidx.core.widget.NestedScrollView>
    

    NestedScrollView嵌套SmartRefreshLayout,导致两个问题: 1、无法惯性滑动到底部加载更多 2、手动上拉加载后,再次下拉刷新阻力很大。

    invalid 
    opened by junyao-yu 9
  • 下拉刷新内存问题

    下拉刷新内存问题

    不知道作者有没有发现每次下拉刷新,在内存稳定后,应用内存暂用会比刷新之前增加1~2M。每次刷新都会增加1~2M。而且下拉刷新时,内存抖动比较厉害(瞬间内存波动在10~20M左右)。 我在我项目中接入了这个库,在列表一直下拉刷新,一会儿应用内存就从50M涨到了100多M,并且GC不掉。 clone你的项目到本地,运行Demo工程一样存在该问题,下拉10~20次,应用内存占用从30M上升到60M,并且GC不掉。

    opened by douyav9 9
  • 请问上拉的回弹效果不能单独设置?

    请问上拉的回弹效果不能单独设置?

    如果还是没有找到答案,提问请带上这几个必要信息 1.当前使用的版本号 v1.0.3 2. 我查看demoProfilePracticeActivity有回弹功能,查看xml中配置,发现开启了

    app:srlEnablePureScrollMode="true"
    app:srlEnableLoadmore="true"
    

    我的界面结构是

    <srl>
      <recyclerview/>
    </srl>
    

    于是我就在自己的demo中增加了相应属性,发现这样就不能触发刷新的操作,列表中没有数据。 我的demo中有个列表想要有上拉的回弹功能,但是上拉加载的实现没有用到srl,而是通过自己实现的adapter来触发刷新的。

    但是如果app:srlEnablePureScrollMode="true"修改为false的话,就会有srl库默认的footer显示。 所以想问下,上拉的回弹效果只能通过开启上拉加载来实现?而不是单独开启?

    opened by pdog18 9
  • 为何先执行onStartAnimator,后执行onReleasing?

    为何先执行onStartAnimator,后执行onReleasing?

    对于我这种想要实现三段式下拉刷新动画的需求,基本上就无法实现第二步-手指抬起到回到触发刷新的位置这段时间的动画了。 我们的三段分别为: 第一段,手指下拉过程的动画 第二段,手指抬起之后的动画,如果此时的位置大于可触发刷新的最小位置,则做动画,回到刷新头保持的位置。如果此时位置小于可触发刷新的最小位置,则逆向执行第一段动画。 第三段,刷新头回到触发刷新位置(刷新过程中刷新头保持的位置),此时才应该开始执行刷新的动画。 但是使用过程发现,SmartRefreshLayout无法做第二段动画,直接执行第三段。

    opened by gitgeek4dx 9
  • 无法刷新或加载更多

    无法刷新或加载更多

    SmartRefreshLayout中包含ListView,当ListView内容为空的时候,不能刷新也不能加载更多。 mListView.setNestedScrollingEnabled(false)也不能解决问题。代码如下:

        <com.scwang.smartrefresh.layout.SmartRefreshLayout xmlns:app="http://schemas.android.com/apk/res-auto"
            android:id="@+id/mRefreshView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:srlDisableContentWhenRefresh="true"
            app:srlEnableAutoLoadmore="false"
            app:srlEnableHeaderTranslationContent="false"
            app:srlEnableLoadmore="true">
    
            <ListView
                android:id="@+id/mListView"
                android:layout_width="match_parent"
                android:layout_height="match_parent" />
    
        </com.scwang.smartrefresh.layout.SmartRefreshLayout>
    opened by DCRain 9
  • 崩溃错误 java.lang.NoSuchMethodError: No static method lambda$static$1

    崩溃错误 java.lang.NoSuchMethodError: No static method lambda$static$1

    FATAL EXCEPTION: main
                                                                                 Process: com.buglee.lee.timelinenote, PID: 15368
                                                                                 Theme: themes:{default=overlay:com.zui.theme.XuiSkin.pink, iconPack:com.zui.theme.XuiSkin.pink}
                                                                                 java.lang.NoSuchMethodError: No static method lambda$static$1(Landroid/content/Context;Lcom/scwang/smartrefresh/layout/api/RefreshLayout;)Lcom/scwang/smartrefresh/layout/api/RefreshHeader; in class Lcom/scwang/smartrefresh/layout/SmartRefreshLayout; 
                                                                                     at com.scwang.smartrefresh.layout.SmartRefreshLayout$$Lambda$15.createRefreshHeader(Unknown Source)
                                                                                     at com.scwang.smartrefresh.layout.SmartRefreshLayout.onAttachedToWindow(SmartRefreshLayout.java:383)
    
    opened by artdxl 9
  •  java.lang.NoSuchMethodError 闪退

    java.lang.NoSuchMethodError 闪退

    偶现出现NoSuchMethodError,错误信息如下:

    java.lang.NoSuchMethodError: No virtual method c(Lcom/scwang/smart/refresh/layout/api/cliif;)Lcom/scwang/smart/refresh/layout/api/cliint; in class Lcom/scwang/smart/refresh/layout/SmartRefreshLayout; or its super classes (declaration of 'com.scwang.smart.refresh.layout.SmartRefreshLayout' appears in /data/user/0/com.lynkco.customer/[email protected])

    opened by zhangxiaojin770 0
  • 希望加入一个参数

    希望加入一个参数

    希望加入一个boolean参数:header如果被设置成了SpinnerStyle.FixedFront,下拉释放后,Content整体回到原始位置,让header在content上层显示,有轻微遮挡。原因:header有时候是状态指示器,但它是弱状态,不影响其他ui使用。现在的header加载时content整体被下移,加载完就自动上移,上移过程中不方便content的点击。

    opened by sonicepro 0
Releases(V2.0.5)
  • V2.0.5(Dec 3, 2021)

  • V2.0.3(Dec 3, 2021)

  • V2.0.0(Jul 23, 2020)

  • V1.1.0(Aug 13, 2019)

    添加:finishRefreshWithNoMoreData 方法
    添加:DefaultRefreshInitializer 全局初始化
    添加:srlHeaderTranslationViewId 属性,指定下拉Header时偏移的视图Id
    添加:srlFooterTranslationViewId 属性,指定上拉Footer时偏移的视图Id
    添加:setDefaultRefreshInitializer 方法,采用优先级最低的配置全局设置
    添加:closeHeaderOrFooter 方法,可以关闭正在打开的Header或者Footer
    添加:autoLoadMoreAnimationOnly 方法,只显示动画不执行加载
    添加:autoRefreshAnimationOnly 方法,只显示动画不执行刷新
    添加:TwoLevelHeader.openTwoLevel 方法,主动打开二楼
    添加:水平滚动刷新支持,demo版本
    添加:对 ViewPager2,MotionLayout,BottomSheet,AndroidX 的兼容支持
    添加:MaterialHeader 添加圆盘背景颜色修改支持
    集成:类似淘宝二楼的二级下拉刷新 TwoLevelHeader
    删除:部分冗余的API接口
    删除:1.0.5 中标记过时的API接口
    优化:淘宝二楼展开中途可以被拦截的问题
    优化:极度优化算法,使得dex-method从1366降低到788
    精简:极度精简代码,是的dex-size从139kb降低到121kb
    兼容:修改算法使得可以在BottomSheetDialog内部使用
    修改:把仿苹果越界拖动功能默认为关闭,需要手动打开
    修改:部分Header的命名修改为严格骆驼峰
    修改:标记 Scale 样式过时,原因是 Scale 再拖动是会不停【测量】(header)和 【布局】(layout)性能低下
    修改:将之前自带Header中 Scale 样式全部采用 FixedBehind 代替,用户如需替换可以参考这些demo
    修复:修复聊天下拉加载没有惯性问题自动加载问题
    修复:BallPulseFooter在Xml初始化颜色无效问题
    修复:EnableLoadMoreWhenContentNotFull=false导致无法加载的问题
    修复:onDetachedFromWindow 报NPE错误问题

    Source code(tar.gz)
    Source code(zip)
  • V1.0.5(Feb 5, 2018)

    添加:srlEnableScrollContentWhenRefreshed 属性和对应方法 添加:srlEnableClipHeaderWhenFixedBehind 属性和对应方法 添加:srlEnableClipFooterWhenFixedBehind 属性和对应方法 添加:srlHeaderInsetStart 属性和对应方法 添加:srlFooterInsetStart 属性和对应方法 添加:setNoMoreData(boolean) 方法 优化:优化越界回弹的效果 优化:优化Header和Footer与列表的惯性连续 解决:去掉XML预览功能对 Design 兼容包的依赖 修复:仿苹果越界拖动在特定条件下不连续问题 修复:finishLoadMoreWithNoMoreData 显示顺序错乱问题 修复:老版本种使用错误的单词 creator loadMore 修复:Xml预览模式在没有Header和Footer时的显示问题 修复:AppbarLayout 嵌套滚动时的bug

    Source code(tar.gz)
    Source code(zip)
  • V1.0.4(Nov 27, 2017)

    添加:finishLoadmoreWithNoMoreData 方法 完成加载并标记没有更多数据
    添加:resetNoMoreData 方法 恢复没有更多数据的原始状态
    添加:setRefreshContent 方法 设置刷新Content(用于动态替换空布局)
    添加:srlHeaderTriggerRate 属性和set方法 设置触发刷新距离 与 HeaderHieght 的比率(默认1)
    添加:srlFooterTriggerRate 属性和set方法 设置触发加载距离 与 FooterHieght 的比率(默认1)
    添加:srlEnableOverScrollDrag 属性和对应的set方法 设置 是否启用越界拖动(仿苹果效果)
    添加:srlEnableFooterFollowWhenLoadFinished 属性和set方法 是否在全部加载结束之后Footer跟随内容
    添加:refreshHeader 添加 setLastUpdateText 方法 手动设置更新时间
    添加:refreshHeader 添加 onRefreshReleased 方法 手势释放时调用
    添加:refreshFooter 添加 onLoadmoreReleased 方法 手势释放时调用
    修改:修改Header 名称 Circle 为 BezierCircle
    修改:改变 onStartAnimator 的调用时机为 释放之后会回弹到标准高度调用
    修改:srlEnableLoadmoreWhenContentNotFull 的默认值 由 false 改成 true

    Source code(tar.gz)
    Source code(zip)
  • V1.0.3(Oct 17, 2017)

    添加:下拉和上拉时,支持多点触摸,手势不冲突 添加:当 内容视图不满一页时,默认不能上拉加载更多,不过必要时,通过设置还是可以上拉的
    添加:为 Heaer和Footer添加拖动时水平方向坐标 x,实现左右拖动Header的效果
    添加:为 Refreshlayout 添加多点触摸支持,在多个手指触摸式不会发生冲突,并且随意拖动
    添加:为 Refreshlayout 添加 EnableLoadmoreWhenContentNotFull 功能
    添加:为 RefreshHeader 添加 srlEnableHorizontalDrag 属性 和 setEnableHorizontalDrag 方法
    添加:为 ClassicsHeader 添加 srlArrowDrawable 属性 和 setArrowResource 方法 改变箭头图片
    添加:为 ClassicsHeader 添加 srlProgressDrawable 属性 和 setProgressResource 改变转动图片
    添加:为 ClassicsFooter 添加 srlArrowDrawable 属性 和 setArrowResource 方法 改变箭头图片
    添加:为 ClassicsFooter 添加 srlProgressDrawable 属性 和 setProgressResource 改变转动图片
    修改:改 EnableLoadMore 由默认true->变为false,并增加智能开启功能
    修改:改 EnableNestedScrolling 由默认true->变为false,并增加智能开启功能
    修复:为ClassicsFooter加载失败时,显示成了加载完成
    修复:正在刷新时,向上拖动导致的栈溢出崩溃
    修复:autoRefresh(0) 的 延时为没有延时
    修复:StaggeredGridLayoutManager 导致的 autoLoadmore 无效
    修复:列表监听滚动无效的问题
    修复:内存泄漏问题

    Source code(tar.gz)
    Source code(zip)
  • V1.0.2(Aug 3, 2017)

    添加:AbsListView 和 RecyclerView 的越界回弹
    添加:srlFixedHeaderViewId 属性,指定固定的视图Id
    添加:srlFixedFooterViewId 属性,指定固定的视图Id
    添加:srlEnablePureScrollMode 属性,是否开启纯滚动模式
    添加:srlEnableNestedScrolling 属性,是否开启嵌套滚动NestedScrolling
    添加:srlEnableScrollContentWhenLoaded 属性,是否在加载完成之后滚动内容显示新数据
    添加:setRefreshScrollBoundary 方法,设置滚动边界判断
    添加:finishRefresh(boolean success);方法,完成刷新,并设置是否成功
    添加:finishLoadmore(boolean success);方法,完成加载,并设置是否成功
    修复:DeliveryHeader,DropboxHeader 在API-17以下显示不全的问题

    Source code(tar.gz)
    Source code(zip)
  • V1.0.1(Aug 3, 2017)

    添加:srlEnableAutoLoadmore 属性
    修改:srlExtendHeaderRate 属性为:srlHeaderMaxDragRate
    修改:srlExtendFooterRate 属性为:srlFooterMaxDragRate
    修复:DeliveryHeader,DropboxHeader 在API-21以下崩溃的问题

    Source code(tar.gz)
    Source code(zip)
  • V1.0.0(Aug 3, 2017)