您的位置:首页 > 其它

关于SwipeRefreshLayout在onCreate中调用setRefreshing()方法时的修改

2014-11-24 13:50 337 查看
对于联网类型的应用,通常我们在进入应用时,需要加载数据,并且提示一个加载的进度条。如果使用官方的下拉刷新控件SwipeRefreshLayout本身是带进度条显示功能的,我们自然会想要重用他的进度条。但是如果你想要在onCreate里把他调出来,直接调用setRefreshing()方法是不行的,如下是setRefreshing()方法的源码:

public void setRefreshing(final boolean refreshing)
{

if (refreshing && mRefreshing != refreshing)
{

// scale and show

mRefreshing = refreshing;

int endTarget =
0;

if (!mUsingCustomStart)
{

endTarget = (int)
(mSpinnerFinalOffset + mOriginalOffsetTop);

} else {

endTarget = (int) mSpinnerFinalOffset;

}

setTargetOffsetTopAndBottom(endTarget - mCurrentTargetOffsetTop,

true /*
requires update */);

mNotify = false;

startScaleUpAnimation(mRefreshListener);

} else {

setRefreshing(refreshing, false /*
notify */);

}

}

查看源码,可以知道,该方法内部主要是调用了setTargetOffsetTopAndBottom()方法调整进度条的位置来显示的。在没出控件完成onLayout方法之前,位置数据都是不准确的,所以显示不出来很正常。

要解决这个问题很简单,把咱们要做的这个事情需要通过post(Runnable runnable)方法放到UI线程排队执行,否则,参数不对,自然显示不出来。

mSwipeRefreshLayout.post(new Runnable()
{

@Override

public void run()
{

mSwipeRefreshLayout.setRefreshing(true);

}

});

当然,也可以把源码提出来将原方法稍微修改一下,一劳永逸。如下:

/**

* Notify the widget that refresh state has changed. Do not call this when

* refresh is triggered by a swipe gesture.

*

*@paramrefreshing
Whether or not the view should show refresh progress.

*/

public void setRefreshing(final boolean refreshing)
{

if(refreshing&&mRefreshing!=refreshing)
{

post(new Runnable()
{

@Override

public void run()
{

// scale and show

mRefreshing=refreshing;

int endTarget=
0;

if(!mUsingCustomStart)
{

endTarget= (int)
(mSpinnerFinalOffset+mOriginalOffsetTop);

}else{

endTarget= (int)mSpinnerFinalOffset;

}

setTargetOffsetTopAndBottom(endTarget-mCurrentTargetOffsetTop,true/*

* requires

* update

*/);

mNotify=false;

startScaleUpAnimation(mRefreshListener);

}

});

}else{

setRefreshing(refreshing,false/*
notify */);

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐