美文网首页
使用SwipRefreshLayout控件快速下拉,控件消失的问

使用SwipRefreshLayout控件快速下拉,控件消失的问

作者: yangMr | 来源:发表于2017-10-17 20:27 被阅读0次

    碰到的问题

    在使用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 ,很感谢某位大大给我说明了问题所在之处,让我得以解决。

    过程分析

    1. 在个人进行尝试过程中,曾经怀疑过是否为 mSwipeRefreshLayout.setEnabled(true); 这句enabled的最终状态没有设置为true。但是在调试过程中,发现并非这个的问题。
    2. 在把加载更多给屏蔽掉之后,测试SwipeRefreshLayout控件并没有出现上述bug,猜测可能是加载更多的时候出现了一些状况。
    3. 在查看 BRVAH 此库demo中的 PullToRefreshUseActivity 类后,自己修改了一点然后测试了一下,发现也有出现这个情况,这个demo中的下拉与加载更多同时进行的时候没有做屏蔽处理。于是我提出了一个issue,非常幸运,我当天下午提的,下班回家时就看到了解决方案,万分感谢~~~。
    4. 这个最主要是由于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;
        }
    }
    

    相关文章

      网友评论

          本文标题:使用SwipRefreshLayout控件快速下拉,控件消失的问

          本文链接:https://www.haomeiwen.com/subject/usljuxtx.html