# 常见问题 ## 0.恢复经典模式 SmartRefresh默认使用了比较新的功能,如:越界回弹、越界拖动、自动加载更多,这些效果都是比较流行,并且具有仿苹果的效果,如果之前使用很早的经典刷新库的童鞋感觉不适应,这些功能都是可以关闭的。 代码设置 ~~~java refreshLayout.setEnableAutoLoadMore(false);//使上拉加载具有弹性效果 refreshLayout.setEnableOverScrollDrag(false);//禁止越界拖动(1.0.4以上版本) refreshLayout.setEnableOverScrollBounce(false);//关闭越界回弹功能 ~~~ XML属性 ~~~xml ~~~ ## 1.获取当前状态?isRefreshing(),isLoading() 不见了?(1.1.0以上版本,2.x 回归) 版本的迭代,刷新的状态越来越多,仅仅 isRefreshing(),isLoading() 已经无法满足要求,在1.0.5版本之后本库直接将 内部 State 开放出来,并在1.0.5版本标记 isRefreshing(),isLoading() 过期,鼓励大家使用 getState 来代替。将在 1.1.0版本删除这两个API。 getState 比前两个方法更有用,具体参考下面代码。 ~~~java refreshLayout.getState() == RefreshState.None //空闲状态 refreshLayout.getState() == RefreshState.Loading//代替 isLoading refreshLayout.getState() == RefreshState.Refreshing//代替 isRefreshing refreshLayout.getState().isDragging //判断是否正在拖拽刷新控件(非拖拽列表) refreshLayout.getState().isFinishing //判断动画是否正在结束 refreshLayout.getState().isHeader //判断当前是否处于 Header 的一系列状态中 refreshLayout.getState().isFooter //判断当前是否处于 Footer 的一系列状态中 refreshLayout.getState().isOpening // 等同于 isLoading || isRefreshing ~~~ ## 2.嵌套WebView,还没滚动到顶部就开始下拉刷新了? > WebView 的问题多由内部Html中采用了绝对坐标导致的,所以问题很难从java层面解决这个问题。 我建议直接再Html内部实现下拉刷新,或者采用自定义滚动边界,参考 [#394](https://github.com/scwang90/SmartRefreshLayout/issues/394)。 另外 [SCDN](https://blog.csdn.net/niuzhijun66/article/details/86290182) 博客中有人给出解决方案 ## 3.列表内容才几条,却可以上拉加载? SmartRefresh提供了对数据不满一页判断处理,可以通过EnableLoadMoreWhenContentNotFull来控制 代码设置 ~~~java refreshLayout.setEnableLoadMoreWhenContentNotFull(false);//取消内容不满一页时开启上拉加载功能 ~~~ XML属性 ~~~xml ~~~ ## 4.如何修改经典刷新文字? SmartRefresh的经典文字自带了国际化(中/英),如需自定义文字显示,可以通过以下两种方法设置: 代码设置(APP在运行是,更改系统语言,本方法无效) ClassicsHeader 和 ClassicsFooter 的描述文字是可以修改的,不要看错成了常量哦~ ~~~java public class App extends Application { @Override public void onCreate() { super.onCreate(); ClassicsHeader.REFRESH_HEADER_PULLING = getString(R.string.header_pulling);//"下拉可以刷新"; ClassicsHeader.REFRESH_HEADER_REFRESHING = getString(R.string.header_refreshing);//"正在刷新..."; ClassicsHeader.REFRESH_HEADER_LOADING = getString(R.string.header_loading);//"正在加载..."; ClassicsHeader.REFRESH_HEADER_RELEASE = getString(R.string.header_release);//"释放立即刷新"; ClassicsHeader.REFRESH_HEADER_FINISH = getString(R.string.header_finish);//"刷新完成"; ClassicsHeader.REFRESH_HEADER_FAILED = getString(R.string.header_failed);//"刷新失败"; ClassicsHeader.REFRESH_HEADER_UPDATE = getString(R.string.header_update);//"上次更新 M-d HH:mm"; ClassicsHeader.REFRESH_HEADER_UPDATE = getString(R.string.header_update);//"'Last update' M-d HH:mm"; ClassicsHeader.REFRESH_HEADER_SECONDARY = getString(R.string.header_secondary);//"释放进入二楼" ClassicsFooter.REFRESH_FOOTER_PULLING = getString(R.string.footer_pulling);//"上拉加载更多"; ClassicsFooter.REFRESH_FOOTER_RELEASE = getString(R.string.footer_release);//"释放立即加载"; ClassicsFooter.REFRESH_FOOTER_LOADING = getString(R.string.footer_loading);//"正在刷新..."; ClassicsFooter.REFRESH_FOOTER_REFRESHING = getString(R.string.footer_refreshing);//"正在加载..."; ClassicsFooter.REFRESH_FOOTER_FINISH = getString(R.string.footer_finish);//"加载完成"; ClassicsFooter.REFRESH_FOOTER_FAILED = getString(R.string.footer_failed);//"加载失败"; ClassicsFooter.REFRESH_FOOTER_NOTHING = getString(R.string.footer_nothing);//"全部加载完成"; } } ~~~ 资源覆盖(1.1.0 以上版本) ~~~xml 下拉可以刷新 正在刷新… 正在加载… 释放立即刷新 刷新完成 刷新失败 上次更新 M-d HH:mm 释放进入二楼 上拉加载更多 释放立即加载 正在加载… 正在刷新… 加载完成 加载失败 没有更多数据了 ~~~ XML直接指定(1.1.0 最新版) ~~~xml ~~~ #### 注意:上次更新时间的英文格式需要加单引号如: 'Last update' M-d HH:mm ## 5.触发下拉刷新的距离 SmartRefresh触发下拉刷新的距离就是 Header 的高度乘以比率:HeaderHeight*HeaderTriggerRate,下拉的距离超过这个值释放时就可以触发刷新事件,否则回弹到原始状态。 HeaderTriggerRate 默认是 1,改成0.5,那么再下拉到一半的时候就可以刷新了 改变这个距离就是 setHeaderHeight,footer 类推 ##### 相关方法 | name | format | description | | :------------------: | :-------: | :-------------------------------: | | setHeaderHeight | dimension | Header的标准高度 | | setFooterHeight | dimension | Footer的标准高度 | | setHeaderTriggerRate | float | Header触发刷新距离与HeaderHeight的比率(默认1) | | setFooterTriggerRate | float | Footer触发加载距离与FooterHeight的比率(默认1) | ##### 相关属性 | name | format | description | | :------------------: | :-------: | :-------------------------------: | | srlHeaderHeight | dimension | Header的标准高度(dp) | | srlFooterHeight | dimension | Footer的标准高度(dp) | | srlHeaderTriggerRate | float | Header触发刷新距离与HeaderHeight的比率(默认1) | | srlFooterTriggerRate | float | Footer触发加载距离与FooterHeight的比率(默认1) | ## 6.阻尼效果参数 SmartRefresh的阻尼相关参数有两个 > DragRate = 显示拖动距离 / 手指真实拖动距离 (要求<= 1,越小阻尼越大) > MaxDragRate = 最大拖动距离 / Header或者Footer的高度 (要求>=1,越大阻尼越小) ##### 相关方法 | name | format | description | | :------------------: | :-------: | :---------------------------------: | | setDragRate | dimension | 设置拖动比率 | | setHeaderMaxDragRate | float | Header最大拖动距离与HeaderHeight的比率(默认2.5) | | setFooterMaxDragRate | float | Footer最大拖动距离与FooterHeight的比率(默认2.5) | ##### 相关属性 | name | format | description | | :------------------: | :-------: | :---------------------------------: | | srlDragRate | dimension | 设置拖动比率 | | srlHeaderMaxDragRate | float | Header最大拖动距离与HeaderHeight的比率(默认2.5) | | srlFooterMaxDragRate | float | Footer最大拖动距离与FooterHeight的比率(默认2.5) | ## 7.全局设置基本参数 SmartRefresh提供的全局设置方法不仅可以设置 Header 和 Footer 的样式,其他的参数也可以直接设置如下: ~~~java public class App extends Application { static {//使用static代码段可以防止内存泄漏 //设置全局默认配置(优先级最低,会被其他设置覆盖) SmartRefreshLayout.setDefaultRefreshInitializer(new DefaultRefreshInitializer() { @Override public void initialize(@NonNull Context context, @NonNull RefreshLayout layout) { //开始设置全局的基本参数 layout.setReboundDuration(1000); layout.setReboundInterpolator(new DropBounceInterpolator()); layout.setFooterHeight(100); layout.setDisableContentWhenLoading(false); layout.setPrimaryColorsId(R.color.colorPrimary, android.R.color.white); } }); //全局设置默认的 Header SmartRefreshLayout.setDefaultRefreshHeaderCreator(new DefaultRefreshHeaderCreator() { @Override public RefreshHeader createRefreshHeader(Context context, RefreshLayout layout) { //开始设置全局的基本参数(这里设置的属性只跟下面的MaterialHeader绑定,其他Header不会生效,能覆盖DefaultRefreshInitializer的属性和Xml设置的属性) layout.setEnableHeaderTranslationContent(false); return new MaterialHeader(context).setColorSchemeResources(R.color.colorRed,R.color.colorGreen,R.color.colorBlue); } }); } } ~~~ ## 8.没有上拉,快速滚动列表,Footer自己冒上来了? 这个功能是本刷新库的特色功能:在列表滚动到底部时自动加载更多。 如果不想要这个功能,是可以关闭的: 代码设置 ~~~java refreshlayout.setEnableAutoLoadMore(false); ~~~ XML属性 ~~~xml ~~~ ## 8.还没调用 finishRefresh ,刷新就自动结束了? 解决办法:setRefreshListener ~~~java refreshLayout.setRefreshListener(listener); ~~~ 实际项目中都会设置监听器的,所以不设置的都是demo,为了demo方便就默认3秒之后关闭了,如果一直不关闭,体验不好 ## 10.添加固定的头布局 本库支持添加固定的头布局,参考 Demo-实战-微博列表 ![image](https://github.com/scwang90/SmartRefreshLayout/raw/master/art/gif_practive_feedlist.gif) 注意:是**固定**的头布局,如果是想添加可以滚动的头布局,请使用开源的Adapter实现 ## 11.显示没有更多数据,并不再触发加载更事件 ~~~java //加载结束之后的逻辑 if (/*加载更多成功*/) { if (/*服务器还有更多数据*/){ refreshlayout.finishLoadMore(); } else { refreshlayout.finishLoadMoreWidthNoMoreData();//显示全部加载完成,并不再触发加载更事件 } } else { refreshlayout.finishLoadMore(false);//表示加载失败 } //刷新结束之后 if (/*刷新成功*/) { refreshlayout.finishRefresh(); refreshlayout.setNoMoreData(/*服务器不再有更多数据*/)//复原状态 } else { refreshlayout.finishRefresh(false);//表示刷新失败(不会更新时间) } ~~~ ## 12.加载更多一直显示?不能触发下拉刷新? ~~~java //尝试在 setNoMoreData 之前加上 finishLoadMore refreshlayout.finishLoadMore(); refreshlayout.setNoMoreData(false); ~~~ ## 13.AndroidStudio 不能预览 这个问题可能会出现在 1.1.0 版本之前,这个问题并不会影响运行效果,如果无法忍受预览失效请加上 ~~~ compile 'com.android.support:design:25.3.1' ~~~ ## 14.不显示“加载完成”和“刷新完成”,直接因此 Header或者Footer。 Smart 可以修改 “加载完成”和“刷新完成” 的显示时间,所以想不现实它们,直接把显示时间设置为0即可。 ``` header.setFinishDuration(0);//设置Footer 的 “刷新完成” 显示时间为0 footer.setFinishDuration(0);//设置Footer 的 “加载完成” 显示时间为0 ``` ## 15.RecyclerView,ListVIew,ScrollView,NestScrollView,滚动冲突 1. 如果是 RecyclerView 和 NestScrollView 先尝试打开 Smart 的嵌套滚动功能 2. 如果是 ListVIew,ScrollView,可以尝试 同时打开 ScrollView,ScrollView,Smart 的嵌套滚动功能 3. 如果 1,2 都无效,这需要自定义滚动边界自己实现 canRefresh 和 canLoadMore,自己用代码告诉Smart 什么时候可以 刷新,什么时候可以加载 ## 16.finishLoadMoreWithNoMoreData /没有更多数据 账号,Footer 还显示了loading/转圈 1.最常见的原因是 finishLoadMore 和 finishLoadMoreWithNoMoreData 同时调用导致的。 他们都有关闭 Footer 的功能,所以 finishLoadMore 会导致 finishLoadMoreWithNoMoreData 功能异常。 这样解释会比较清楚 finishLoadMoreWithNoMoreData = finishLoadMore + setNoMoreData(true) 所以解决办法是去掉 finishLoadMoreWithNoMoreData 前面的 finishLoadMore 如下: ```java //refreshLayout.finishLoadMore(); //前面的 finishLoadMore 要删除 if(true/*没有更多数据*/) { refreshLayout.finishLoadMoreWithNoMoreData(); } else { refreshLayout.finishLoadMore(); //在 else 中添加 finishLoadMore } ``` 2.少见原因(1.1.0版本以前) 只调用了 setNoMoreData(true) 未调用 finishLoadMore setNoMoreData 的关闭 Footer 功能是 1.1.0 后面添加的,所以之前的版本 setNoMoreData 必须和 finishLoadMore 一起使用如: ```java if(true/*没有更多数据*/) { refreshLayout.setNoMoreData(true); refreshLayout.finishLoadMore()// setNoMoreData 后面必须加finishLoadMore(1.1.0版本以前) //refreshLayout.finishLoadMoreWithNoMoreData(); 也可以用 finishLoadMoreWithNoMoreData 代替上面两行 } else { refreshLayout.finishLoadMore(); } ```