android-viewpager setCurrentItem和滑动切换fragment的区别

   在不缓存的viewpager里面有两个fragment1,fragment2;当滑动切换的时候,

   fragment1滑动到fragment2生命周期是:fragment1.onstop()->fragment2.onResume();

   但是当使用setCurrentItem(1)的时候,生命周期是:fragment2.onResume()->fragment1.onstop();

   这是因为在viewpager源码里面,setCurrentItem方法里面:

   public void setCurrentItem(int item, boolean smoothScroll) {
       mPopulatePending = false;
       setCurrentItemInternal(item, smoothScroll, false);
   }

   其中setCurrentItemInternal方法里面:

   

   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;
        mCurItem = item;
//        populate();
        final int destX = (getWidth() + mPageMargin) * item;
        if (smoothScroll) {
            smoothScrollTo(destX, 0, velocity);
            if (dispatchSelected && mOnPageChangeListener != null) {
                mOnPageChangeListener.onPageSelected(item);
            }
        } else {
            if (dispatchSelected && mOnPageChangeListener != null) {
                mOnPageChangeListener.onPageSelected(item);
            }
            completeScroll();
            scrollTo(destX, 0);
        }
    }

  将红色代码注释掉,滑动和setCurrentItem两者切换fragment的生命周期流程就可以保持一致.

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值