從setCurrentItem(int item)探索ViewPager


前言:

   對於開博第一篇,花點時間寫個前言,哈哈~
   先記錄下我的初心:
   1,作為一個android從業者,發現有價值的開源分享,會有莫名的欣喜,我也跟隨大神們的腳步,希望給世界輸出點       點滴~
   2,android開發需要積累,經驗積累,文檔代碼積累,whatever,給自己留下些可以翻閱的筆記。
   3,時代很快,做個會時刻總結的人,去審視昨天的自己,做最好的當下。

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------

哈哈!
   正文開始:

  由於要實現ViewPager的無限循環引發的博文案!!
  網上不改源代碼有兩種實現方式:具體請移步該處:http://blog.csdn.net/just_sanpark/article/details/17436037
  問題來了,覺得這樣在外面實現不過癮,想在源碼內部實現,但是能力還不夠獨立通讀源碼進行修改,怎么辦?
  網絡的力量的偉大的~
    先上理解ViewPager的實現的前菜(ViewPager基本實現原理),引用郭神博文的一句話:
        ViewPager最基本的實現原理主要就是兩部分內容,一個是事件分發,一個是Scroller!
   墊完肚子之后,上正菜:
   我們跟下面的大神通讀一遍ViewPager的源碼:
   博文地址:ViewPager源碼解惑

---------------------我是一條美麗的分割線-------------------------------------------------------------------
  讀源碼對於初學者是頭疼的過程,一盤大菜,小編還在努力中,也吃不完那么多,所以先從小地方啃起~
  回到本文標題:
  ctrl進setCurrentItem(int item)方法,見如下:
 /**
         * Set the currently selected page. If the ViewPager has already been through its first
         * layout with its current adapter there will be a smooth animated transition between
         * the current item and the specified item.
         * @param item Item index to select
         */
        public void setCurrentItem(int item) {
            mPopulatePending = false;
            setCurrentItemInternal(item, !mFirstLayout, false);
        }

        /**
         * Set the currently selected page.
         * @param item Item index to select
         * @param smoothScroll True to smoothly scroll to the new item, false to transition immediately
         */
        public void setCurrentItem(int item, boolean smoothScroll) {
            mPopulatePending = false;
            setCurrentItemInternal(item, smoothScroll, false);
        }
   mPopulatePending 是否正在填充的控制變量,方法重載是設置是否需要平滑的切換動畫。
   兩方法都進入到setCurrentItemInternal(int item, boolean smoothScroll, boolean always, int velocity)中
void setCurrentItemInternal(int item, boolean smoothScroll, boolean always, int velocity) {
            if (mAdapter == null || mAdapter.getCount() <= 0) {
                setScrollingCacheEnabled(false);
                return;
            }
            if (!always && mCurItem == item && mItems.size() != 0) {
                setScrollingCacheEnabled(false);
                return;
            }
            if (item < 0) {
                item = 0;
            } else if (item >= mAdapter.getCount()) {
                item = mAdapter.getCount() - 1;
            }
            final int pageLimit = mOffscreenPageLimit;
            if (item > (mCurItem + pageLimit) || item < (mCurItem - pageLimit)) {
                // We are doing a jump by more than one page.  To avoid
                // glitches, we want to keep all current pages in the view
                // until the scroll ends.
                for (int i=0; i<mItems.size(); i++) {
                    mItems.get(i).scrolling = true;
                }
            }
            final boolean dispatchSelected = mCurItem != item;

            if (mFirstLayout) {
                // We don't have any idea how big we are yet and shouldn't have any pages either.
                // Just set things up and let the pending layout handle things.
                mCurItem = item;
                if (dispatchSelected) {
                    dispatchOnPageSelected(item);
                }
                requestLayout();
            } else {
                scrollToItem(item, smoothScroll, velocity, dispatchSelected);
                populate(item);
            }
        }
經過一系列邊值判斷走到dispatchOnPageSelected(item)
<span style="font-family: Arial, Helvetica, sans-serif; white-space: normal; "><span style="font-size:18px;">看接口OnPageChangeListener是否有被用戶實現,有的話執行其中的回調方法。</span></span>
然后回到requestLayout();
該方法的主要作用是:
    requestLayout:當view確定自身已經不再適合現有的區域時,該view本身調用這個方法要求parent view重     新調用他的onMeasure onLayout來對重新設置自己位置。
詳細說明在此:android View中的 requestLayout() 和 invalidate() 原理以及流程
其實這樣子又走回了viewpager的onMeasure 與 onLayout 方法。
又從頭審視ViewPager的源碼啦!!我的天!!!!!
好吧。。。。。。。
onMeasure 方法中調用了ViewPager最核心的方法 populate()。。。。。
斷點單步執行理解ing.......


詳細的源碼分析,請移步下面大神簡書:








注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com