Android智能下拉刷新框架-SmartRefreshLayout

Last update: Jun 22, 2022

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.

GitHub

https://github.com/scwang90/SmartRefreshLayout
Comments
  • 1. 遇到内存泄露问题,请看详情!

    版本号: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也会遇到内存泄漏,请问大佬我写的代码有问题吗?

    Reviewed by ijoncc at 2017-07-31 02:11
  • 2. 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>

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

    Reviewed by lizhw123 at 2017-07-11 03:42
  • 3. 在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机制没有兼容好,但是具体问题在那,还没发现,反馈给作者。

    Reviewed by zengcanxiang at 2017-10-17 09:32
  • 4. 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>
    
    Reviewed by Equalzys at 2017-07-17 06:55
  • 5. 上拉加载更多的问题

    版本是 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页的顶部,然后调用加载更多,以此类推。

    Reviewed by WANZIzZ at 2020-09-25 06:59
  • 6. 如下布局,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、手动上拉加载后,再次下拉刷新阻力很大。

    Reviewed by junyao-yu at 2019-12-09 08:30
  • 7. 下拉刷新内存问题

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

    Reviewed by douyav9 at 2017-12-25 09:15
  • 8. 请问上拉的回弹效果不能单独设置?

    如果还是没有找到答案,提问请带上这几个必要信息 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显示。 所以想问下,上拉的回弹效果只能通过开启上拉加载来实现?而不是单独开启?

    Reviewed by pdog18 at 2017-08-24 00:58
  • 9. 为何先执行onStartAnimator,后执行onReleasing?

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

    Reviewed by gitgeek4dx at 2017-08-09 02:59
  • 10. 无法刷新或加载更多

    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>
    Reviewed by DCRain at 2017-07-25 07:14
  • 11. 崩溃错误 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)
    
    Reviewed by xartd at 2017-07-15 03:42
  • 12. RecyclerView 的 itemview 中使用了recyclerview 并设置了StagedLayoutManager遇到的问题

    RecyclerView 列表的 itemview 中使用了recyclerview 并设置了StagedLayoutManager 遇到一个问题,如果StagedLayoutManager 方向设置成vertical 方向后,滚动列表 当手指触摸在这个itemview 区域 上拉列表的时候 会将加载更多的footer拉出来,(实际这条item并不是列表的最后一条) 触发加载更多回调。把方向设置成horizontal或者改成用LinearLayoutManager 就没有这个问题。

    Reviewed by yilylong at 2022-05-13 13:30
  • 13. SmartRefreshLayout与AndroidX组件新版本存在兼容性问题

    新项目(基于AndroidX,依赖版本普遍比较新)需要实现类似SmartRefreshLayout嵌套CoordinatorLayout嵌套RecyclerView的效果,我直接参考了 NestedScrollExampleFragmentIntegral这个页面的实现,发现手指放在RecyclerView上时,没法一步到位触发下拉刷新和上拉加载更多,需要先把列表拉到顶部,松开手指后再下拉,才能触发刷新。 折腾了一天,没找出哪里有问题,demo那里还套了层ViewPager,我这只有个RecyclerView,不应该啊。

    最后瞄了下SmartRefreshLayout里面gradle的配置,嗯?好像没看到AndroidX,还用的support包,怀疑有没有可能是依赖的问题,于是把SmartRefreshLayout升级到AndroidX。

    没升级AndroidX前,部分依赖是这样的:

        implementation 'com.android.support:design:28.0.0'
        implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    

    自动升级AndroidX后,部分依赖的版本还是比较老的,如下:

        implementation 'com.google.android.material:material:1.0.0'
        implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    

    解决gradle某些异常后,运行,没问题,跟原demo一样,能正常一步到位触发下拉。 后面升级依赖:

        implementation 'com.google.android.material:material:1.4.0' // 实际上升级到1.1.0就出问题了
        implementation 'androidx.constraintlayout:constraintlayout:2.1.3'
    

    运行后,出现了跟我那个项目一样的情况,得拉倒顶部松开再拉一次才能触发刷新,如图: 新依赖

    后面把部分依赖改回刚升级AndroidX时候的版本:

        implementation 'com.google.android.material:material:1.0.0' // 改回1.0.0
        implementation 'androidx.constraintlayout:constraintlayout:2.1.3'
    

    竟然正常了,如图: 新依赖

    基本可以确认SmartRefreshLayout与AndroidX某些组件存在兼容性问题,希望能出一个基于AndroidX的修复版本。

    Reviewed by licheedev at 2022-05-07 09:13
  • 14. 自定义head,在onReleased中覆盖回弹动画,会导致丢失刷新事件

        需求需要实现类似于微信朋友圈的下拉刷新。释放时需要回弹到位置0,所以我的想法是自定义head,在onReleased中通过refreshKernel.animSpinner方法覆盖回弹最终位置。但是发现覆盖后会丢失刷新事件。
        看源码发现原因是在调用onReleased中调用animSpinner方法覆盖了动画。导致丢失之前回弹动画添加的AnimatorListener。建议修改setStateRefreshing方法,在调用onReleased后,重新添加可能丢失的AnimatorListener。
        或者如果以后更好的办法实现我需要的需求,欢迎建议!!!
    
    Reviewed by hugbio at 2022-04-29 07:23