Android SwipeRefreshLayout.setRefreshing(false)无效的解决办法

明明在代码中调用了setRefreshing(false)但是,SwipeRefreshLayout却没有停止刷新,那么原因可能是

  1. 程序中调用的setRefreshing(false);根本没有被执行到,应该通过debug一步一步看,在什么地方跳过了这句代码;

  2. 程序中在该停止的地方成功调用了setRefreshing(false);但是,在其他地方,又再次调用了setRefreshing(true);往往由于不小心或者没考虑到某种情况引起。建议跟踪SwipeRefreshLayout对象,很容易找到问题。

还有的时候我们在Activity启动的时候调用setRefreshing(true)却看不见刷新效果

这个问题的可以通过如下方法解决:

post方式刷新

mSwipeLayout.post(new Runnable() {
                @Override
                public void run() {
                    mSwipeLayout.setRefreshing(true);
                }
            });

这样做的原因很简单,因为在Activity加载的过程中,需要执行onLayout操作来布局各个控件的位置,而通过setRefreshing方法的源码可以知道,这个方法里面执行了一个操作:

setTargetOffsetTopAndBottom(endTarget - mCurrentTargetOffsetTop,
                            true /* requires update */);

该方法是用来调整进度条的位置的,因此,在控件没有完成onLayout之前,控件的位置数据都是不准确的,所以显示不出来。

偏移方式刷新

在调用刷新之前,调用setProgressViewOffset(boolean scale, int start, int end) 调整进度条距离屏幕顶部的距离,个人理解是相当于执行了手动下拉刷新的操作,遇到问题的时候可尝试此方法。

 // 这句话是为了,第一次进入页面的时候显示加载进度条  
  mSwipeRefreshWidget.setProgressViewOffset(false, 0, (int) TypedValue  
    .applyDimension(TypedValue.COMPLEX_UNIT_DIP, 24, getResources()  
      .getDisplayMetrics()));  
  mSwipeRefreshWidget.setRefreshing(true);

你可能感兴趣的:(Android,Bug收集)