4

我創建了FragmentPagerAdapter的無限延伸(有關如何在this site上實現此功能的示例)。這使我可以遍歷50個(任意數量)52個片段(每週一個),從而給用戶帶來無限的片段感。ViewPager.setCurrentItem僅適用於將smoothScroll設置爲true

滾動時/通過調用ViewPager.setCurrentItem片段之間跳躍,有兩種情況,我看到:

  1. 跳只有一個片段無論哪種方式 - 一切正常。這可能是由於在ViewPager.setCurrentItemInternal(查找以We are doing a jump by more than one page這個詞開始的註釋)中的專用代碼
  2. 僅當調用setCurrentItem時,跳過多個片段才能在屏幕上正確顯示新片段當smoothScroll設置爲true(即setCurrentItem(i, true));否則有黑屏

從我所看到的,這可能是因爲ViewPager.scrollToItem中有下面的代碼:

if (smoothScroll) { 
    smoothScrollTo(destX, 0, velocity); 
    if (dispatchSelected) { 
     dispatchOnPageSelected(item); 
    } 
} else { 
    if (dispatchSelected) { 
     dispatchOnPageSelected(item); 
    } 
    completeScroll(false); 
    scrollTo(destX, 0); 
    pageScrolled(destX); 
} 

這是我從我的深度的點。爲什麼這個if/else會導致我正在經歷的現象?

+0

我會看第一個地方是如果你的'FragmentPagerAdapter#getItem()'正確調用適當的位置。這聽起來像是由於某種原因沒有適當地加載片段。你應該看到它也叫三次。一旦在選定的位置,一個之前,一個之後。 – DeeV

+0

@Deev,我添加了條目到logcat來測試這個想法。結果可以在pastie.org/private/ybvvn5rwl1465haic6fvq找到。當'setCurrentItem(i,false)'(即不明原因的情況)被觸發時,getItem被調用3次。請注意,該日誌具有'getItem(1327)'但'newInstance(27)'。這是因爲「無限」查看器 - 1327%52 = 27 – levengli

+0

@levengi我不確定那是什麼問題。看起來這個例子可能是假設光滑滾動已啓用。 – DeeV

回答

2

解釋非常簡單 - ViewPager不會保留所有片段的狀態,因爲如果保持所有狀態都處於活動狀態,將會導致性能災難。

確實存在一種setOffscreenPageLimit方法。其目的是定義ViewPager應該從當前的左邊到右邊保留多少個片段的狀態。欲瞭解更多背景調查官方文檔:https://developer.android.com/reference/android/support/v4/view/ViewPager.html#setOffscreenPageLimit(int)

設置應該保留到處於空閒狀態的視圖層次結構中當前頁面任一側的頁數。超出此限制的頁面將在需要時從適配器重新創建。

這是作爲優化提供的。如果您事先知道您需要支持的頁面數量或者在您的頁面上放置了延遲加載機制,那麼調整此設置可以在分頁動畫和交互的感知平滑度方面帶來好處。如果您有一小部分頁面(3-4)可以一次保持活動狀態,那麼隨着用戶來回翻頁,新創建的視圖子樹的佈局花費的時間會更少。

您應該保持低限,特別是如果您的頁面佈局複雜。此設置默認爲1

所以我們可以看到默認限制爲1 - 這就是爲什麼只跳一個片段的作品完美的答案。這也是平滑滾動情況的答案 - 當您想要使用平滑滾動設置新的當前項目時,這意味着您需要逐個滾動瀏覽所有片段 - 這裏是默認限制1工作的情況。

所以在你的情況下,你可以嘗試setOffscreenPageLimit(52),然後setCurrentItem(50)應該按預期工作。 不建議,只是看它的行爲。如果你的片段有一些困難的工作(比如從網絡加載一些數據),那麼啓動時會有很大的延遲,導致所有片段一次加載。

希望有幫助!

+0

像魅力一樣工作。謝謝 – levengli

+0

不客氣! – rom4ek

相關問題