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

本文探讨了在使用SwipeRefreshLayout时遇到的刷新进度条不显示的问题,并提供了三种解决方案:通过onWindowFocusChanged方法、自定义SwipeRefreshLayout类以及利用View的post方法。

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




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值