SwipeRefreshLayout的进度圈圈无法显示的问题

来源:互联网 发布:网络大电影转化率 编辑:程序博客网 时间:2024/04/27 22:24

最近在使用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);    }});




0 0
原创粉丝点击