天天看點

關于SwipeRefreshLayout在onCreate中調用setRefreshing()方法時的修改

對于聯網類型的應用,通常我們在進入應用時,需要加載資料,并且提示一個加載的進度條。如果使用官方的下拉重新整理控件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 );

        }     }

繼續閱讀