對于聯網類型的應用,通常我們在進入應用時,需要加載資料,并且提示一個加載的進度條。如果使用官方的下拉重新整理控件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 );
mNotify = false ;
startScaleUpAnimation( mRefreshListener );
} else {
setRefreshing( refreshing , false );
} }
檢視源碼,可以知道,該方法内部主要是調用了setTargetOffsetTopAndBottom()方法調整進度條的位置來顯示的。在沒出控件完成onLayout方法之前,位置資料都是不準确的,是以顯示不出來很正常。 要解決這個問題很簡單 ,把咱們要做的這個事情需要通過post(Runnable runnable)方法放到UI線程排隊執行,否則,參數不對,自然顯示不出來。 mSwipeRefreshLayout .post( new Runnable() { @Override public void run() { mSwipeRefreshLayout .setRefreshing( true ); } });
當然,也可以把源碼提出來将原方法稍微修改一下,一勞永逸。如下:
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 );
mNotify = false ;
startScaleUpAnimation( mRefreshListener );
}
});
} else {
setRefreshing( refreshing , false );
} }