2014-02-05 50 views
0

實現ViewPager對象,以便在用戶滑過它之前已經在內存中創建了下一個屏幕。 ViewPager有一個方法setOffscreenPageLimit(n),您可以在其中設置預先創建的ViewPager片段的數量,但不允許n = 0。這背後的原因是爲了保證「流暢的用戶體驗」。然而在我的情況下,頁面n + 1的內容取決於用戶在頁面n上做了什麼。例如,如果用戶點擊了第n頁上的複選框,則可能發生某些小部件不應顯示在第n + 1頁上的情況。我的問題是:我如何確保第n + 1頁被重新創建?如果這是以「流暢的用戶體驗」爲代價的話,那就這樣吧。我能夠攔截滑動事件:在ViewPager中,Fragment(n + 1)取決於用戶在Fragment(n)中的輸入。如何創建Fragment(n + 1)?

pager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() 

在該方法中,我可以調用當前片段的refresh()方法。問題是:我在refresh()方法中做了什麼,或者這是錯誤的方法?我想要重新創建的用戶界面位於onCreate方法中,一種回調方法。或者不能這樣做,我是否需要用新的內存替換內存中的碎片(n + 1),如果是這樣,我該怎麼做?

任何幫助,將不勝感激。

+0

「例如,如果用戶點擊了第n頁上的複選框,則可能發生某些小部件不應顯示在第n + 1頁上的情況 - 嘗試強制重新創建'ViewPager'中的頁面以隱藏小工具類似於試圖通過燒燬你的房子來避免吸塵。如果您想根據複選框隱藏小部件,則**隱藏小部件**。將複選框事件推送到受影響的片段,或者在片段變爲可見時拉動複選框狀態。 – CommonsWare

+0

啊,這是個好主意!碰巧的情況是,在內存中創建的頁面n + 1有一些小部件(複選框組的radiogroup),其中幾個需要隱藏,但不是新創建的。重新創建頁面確實沒有必要。謝謝! – jhulst

+0

我實現了它,它確實工作。現在的問題是單選按鈕列中有漏洞。我希望我能找到一種方法來「合同」列,以消除由隱藏的小部件造成的漏洞。再次感謝。 – jhulst

回答

0

嘗試替換與ViewPager中的頁面關聯的片段將成爲基於片段的PagerAdapter的責任。我不知道使用FragmentPagerAdapterFragmentStatePagerAdapter來完成該操作的簡單方法。 My ArrayPagerAdapter可以更好地處理它,但我不提供直接replace()操作。

在你的情況下,更好的解決方案是調整你有的片段,而不是直接替換片段。從理論上講,這應該可能適用於任何程度的變化。在實踐中,可能會有一定程度的複雜性,然後嘗試替換片段會比嘗試混合所有可能的片段更簡單。

請注意,嵌套的片段可能是另一個選項,其中第N + 1頁是佔位符,並在顯示時運行FragmentTransaction以填充自身。嵌套片段是棘手和古怪的。

關於「洞」,View.INVISIBLE表示您希望小部件繼續佔用空間(例如,在LinearLayout中的東西不會移動之後,它的東西),但不繪製像素。 View.GONE意味着View在佈局上完全被忽略,儘管它仍然在層次結構中,因此如果需要可以輕鬆切換回View.VISIBLE。另一種可能性是將View完全從父容器中移除,但與View.GONE相比,這應該沒有明顯變化。

相關問題