碰到的问题
在使用SwipeRefreshLayout下拉刷新控件,以及 BRVAH 库中的加载更多时,一页数据不满一屏时,多次快速下拉刷新,会出现下拉控件消失,再次下拉,控件无法显示出来的bug。
自己的代码情况
我在网络请求之前,将一些状态进行设置,包括相关加载的屏蔽。
@Override
public void showLoading() {
switch (mRequestType) {
case REQUEST_NORMAL: //正常加载
case REQUEST_FILTER: //筛选加载
mSwipeRefreshLayout.setEnabled(false);
mCustomerRvAdapter.setEnableLoadMore(false);
AnimationUtils.showScaleAnimation(mIvRed, mIvYellow);
break;
case REQUEST_REFRESH: //下拉刷新
mCustomerRvAdapter.setEnableLoadMore(false);
break;
case REQUEST_LOAD_MORE: //加载更多
mSwipeRefreshLayout.setEnabled(false);
break;
}
}
加载完毕后的处理:
@Override
public void hideLoading() {
isFirstLoad = false;
switch (mRequestType) {
case REQUEST_NORMAL: //正常加载
case REQUEST_FILTER: //筛选
AnimationUtils.hideScaleAnimation(mIvRed, mIvYellow);
mSwipeRefreshLayout.setEnabled(true);
break;
case REQUEST_REFRESH: //下拉刷新
mSwipeRefreshLayout.setRefreshing(false);
mSwipeRefreshLayout.setEnabled(true);
mCustomerRvAdapter.setEnableLoadMore(true);
break;
case REQUEST_LOAD_MORE: //加载更多
mSwipeRefreshLayout.setEnabled(true);
break;
}
}
解bug之路
在自己百思不得其解的时候,给 BRVAH 库的贡献者提了一个 Issue ,很感谢某位大大给我说明了问题所在之处,让我得以解决。
过程分析
- 在个人进行尝试过程中,曾经怀疑过是否为 mSwipeRefreshLayout.setEnabled(true); 这句enabled的最终状态没有设置为true。但是在调试过程中,发现并非这个的问题。
- 在把加载更多给屏蔽掉之后,测试SwipeRefreshLayout控件并没有出现上述bug,猜测可能是加载更多的时候出现了一些状况。
- 在查看
BRVAH
此库demo中的 PullToRefreshUseActivity 类后,自己修改了一点然后测试了一下,发现也有出现这个情况,这个demo中的下拉与加载更多同时进行的时候没有做屏蔽处理。于是我提出了一个issue,非常幸运,我当天下午提的,下班回家时就看到了解决方案,万分感谢~~~。- 这个最主要是由于onLoadMoreRequested里调用了SwipeRefreshLayout.setEnabled(false),这里取消了动画,不会回调下拉刷新,但是SwipeRefreshLayout.mRefreshing仍true,导致下次下拉刷新的时候无法刷新。
解决方法
最终的解决办法是在SwipeRefreshLayout.setEnabled(false)前面加上SwipeRefreshLayout.setRefreshing(false)。即可避免出现这种情况,详情请参照SwipeRefreshLayout的源码。
请求前:
@Override
public void showLoading() {
switch (mRequestType) {
case REQUEST_NORMAL: //正常加载
case REQUEST_FILTER: //筛选加载
mSwipeRefreshLayout.setEnabled(false);
mCustomerRvAdapter.setEnableLoadMore(false);
AnimationUtils.showScaleAnimation(mIvRed, mIvYellow);
break;
case REQUEST_REFRESH: //下拉刷新
mCustomerRvAdapter.setEnableLoadMore(false);
mSwipeRefreshLayout.setRefreshing(true);
break;
case REQUEST_LOAD_MORE: //加载更多
mSwipeRefreshLayout.setRefreshing(false);
mSwipeRefreshLayout.setEnabled(false);
break;
}
}
请求后:
@Override
public void hideLoading() {
isFirstLoad = false;
switch (mRequestType) {
case REQUEST_NORMAL: //正常加载
case REQUEST_FILTER: //筛选
AnimationUtils.hideScaleAnimation(mIvRed, mIvYellow);
mSwipeRefreshLayout.setEnabled(true);
break;
case REQUEST_REFRESH: //下拉刷新
mSwipeRefreshLayout.setRefreshing(false);
mCustomerRvAdapter.setEnableLoadMore(true);
break;
case REQUEST_LOAD_MORE: //加载更多
mSwipeRefreshLayout.setEnabled(true);
break;
}
}
网友评论