2012-02-26 75 views
0

比方說,我有一個同質項目列表,這些項目可能會在用戶交互或操作系統事件的活動生命週期中進行更改。 Activity包含FragmentPager,其顯示了多個ListFragment保持FragmentPager中的ListFragments同步

這些片段共享之前提到的數據,但以不同方式顯示。例如。它們在排序順序上不同或僅顯示一部分數據。目前,每個片段都保持一個單獨的列表,其中包含相應順序中數據的相應部分。

當數據發生變化時,基本上每個片段都必須更新。這意味着訴諸或添加/刪除某些片段的項目。 保持不同片段中數據一致的最佳做法是什麼?

目前我有某種觀察員對象,當更改並隨後通知連接的片段時會收到通知。但有幾個問題:

  • 當應用程序剛剛開始,一些片段尚未由FragmentPager創建,因此通知它們是不可能的。
  • 當在片段中滑動時,其中一些片段會暫停。在這種狀態下,他們無法更新他們的列表。在這種情況下他們是否應該與觀察者斷開?這會導致:
  • 發生更改時,片段斷開連接時,基本上會錯過它。
  • 等等...

回答

0

如果我明白你的ViewPager顯示了相同的數據(或它的一部分),但在不同的看法。所以,我相信ViewPager不應該在數據更改時採取任何行動,它是Adapter的責任。

關於您所說的點: a)在ViewPager內部創建片段可以由您管理。只需看看ViewPager::setOffscreenPageLimit(int limit)方法的javadoc。 b)我認爲當數據改變但片段處於暫停狀態時,您不應該對UI進行任何操作。如果您想要更新,請在onResume()中執行。或者更好地設置數據庫中的某個字段(如果有),以「更新存在」狀態並在出現ActivityFragment)時檢查它。 c)和前面的選項一樣 - 如果斷開連接就忽略更新。或者,如果你真的對這個更新感興趣,使用粘性BroadcastReciver(謹慎粘BR是昂貴的東西)

0

你可以保留你的數據在Application類中,當數據改變時只更新可見片段,並且總是要求新數據片段的onResume(),它會這樣做

0

我會做的是每個ListFragment使用Loader加載其數據。然後,不要讓觀察者通知Fragment(可能已被殺死)來刷新其數據,而是要爲每個Loader註冊一個觀察者,以便知道數據源何時發生更改,並在檢測到數據源時重新進行查詢。 (如果您的數據源是SQLite數據庫,並且您使用的是ContentProvider,則CursorLoader將爲您執行所有操作)。

這是我建議因爲

  1. 每個Fragment行爲仍然自包含的實施(即,每個是不依賴於任何特定ViewPagerActivity可重複使用的部件)。

  2. 它避免了您ViewPager內應對潛在破壞Fragment S的複雜性。

如果你需要速戰速決,你很可能逃脫迫使Fragment S使用ViewPager#setOffScreenPageLimit(int limit)伊凡建議留在記憶......然而,這並不像清潔在我看來,解決方案。