最近在使用SwipeRefreshLayout时,发现在界面的onResume方法中调用setRefreshing(true) 。
发现,界面上并没有小圈圈进度条。
原来,这时SwipeRefreshLayout并没有 初始化完成,所以调用setRefreshing(true),并不会显示进度条。
更多答案可以参考:https://code.google.com/p/android/issues/detail?id=77712
解决一:
可以在Activity的
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
}
方法中调用setRefreshing(true)。
因为Activity生命周期中,onStart, onResume, onCreate都不是真正visible的时间点,真正的visible时间点是onWindowFocusChanged()函数被执行时。
这个时候SwipeRefreshLayout已经被初始化完成了。
这个时候时可以正常显示进度条圈圈的。
解决二:
自己重写SwipeRefreshLayout。设置一个标记位,当初是化完成了就去调用setRefreshing(true) 。
/**
* 自定义SwipeRefreshLayout
* Created by wp on 16-3-7.
*/
public class MySwipeRefreshLayout extends SwipeRefreshLayout {
public MySwipeRefreshLayout(Context context) {
super(context);
}
public MySwipeRefreshLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
private boolean mMeasured = false;
private boolean mPreMeasureRefreshing = false;
@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
if (!mMeasured) {
mMeasured = true;
setRefreshing(mPreMeasureRefreshing);
}
}
@Override
public void setRefreshing(boolean refreshing) {
if (mMeasured) {
super.setRefreshing(refreshing);
} else {
mPreMeasureRefreshing = refreshing;
}
}
}
解决三(这个方法没事过,按理说可行):
在View的post方法中,调用setRefreshing(true) 。
因为post方法时View初始化完成后会调用。
注意:这个方法中的 Runnable 是在当前线程执行。(一般为UI线程,因为这个方法一般情况下再UI线程被调用)
所以不需要在使用Handler去更新UI。
swipeToRefreshLayout.post(new Runnable() {
@Override public void run() {
swipeToRefreshLayout.setRefreshing(refreshing);
}
});
本文探讨了在使用SwipeRefreshLayout时遇到的刷新进度条不显示的问题,并提供了三种解决方案:通过onWindowFocusChanged方法、自定义SwipeRefreshLayout类以及利用View的post方法。

1024

被折叠的 条评论
为什么被折叠?



