2013-07-05 30 views
3

我有一個FragmentActivity,其中包含四個片段顯示在選項卡布局。這些標籤用於添加或刪除數據庫中的內容,並按以下順序顯示:Artist - Genre - Album - Song。 「唱片」選項卡包含數據庫中所有藝術家和流派的旋鈕,並且這些旋鈕應當更新爲藝術家或流派添加到其各自的選項卡中。這適用於「藝術家」選項卡;但是,當我在流派標籤中添加或刪除某些內容時,除非將選項卡更改爲藝術家,或者轉到單獨的活動並返回,否則更改將不會顯示在相冊中。java - Android的 - 片段不直接相鄰的更新標籤

我不明白的問題是,當我將標籤佈局更改爲Artist - Genre - Song - Album時,一切正常。似乎只有在查看單獨的活動或片段後才更新這些選項卡,然後返回到應發生更改的選項卡。我也知道這不是用於刷新旋鈕的sql或方法的問題,因爲我也嘗試將版式更改爲Genre - Artist - Album - Song。在這種情況下,類型更新已成功反映在「相冊」中,但藝術家中的類別更新並非如此,直到我將兩個標籤從「相冊」移開。

這很難解釋得很清楚,如果需要,我可以發佈我的代碼,但好像這個問題與直接相鄰的標籤之間的導航有關。

我也嘗試在我的流派片段中添加相冊佈局,然後在添加或刪除流派時更新微調器。

這是AddGenreFragment:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    super.onCreateView(inflater, container, savedInstanceState); 
    View v = inflater.inflate(R.layout.add_genre_layout, container, false); 
    addAlbum = inflater.inflate(R.layout.add_album_layout, container, false); 
    spinGenre = (Spinner) addAlbum.findViewById(R.id.spinGenre); 
    return v; 
} 

然後在刪除方法:

// Refresh the spinners in Add Album 
ArrayList<String> genreList = dbh.getAllGenres();  // Return all the genres in the database 
if (!genreList.isEmpty()) { 
    // Set the genre drop down box to be populated by all genres in the database 
    adapterGenre = new ArrayAdapter<String>(addAlbum.getContext(), 
    android.R.layout.simple_spinner_dropdown_item, genreList); 
    adapterGenre.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
    spinGenre.setAdapter(adapterGenre); 
} 

編輯:

我終於想通了這個問題的解決方案絆腳石上之後在另一個問題。它沒有更新和工作正確的原因是因爲我正在使用帶有片段的ViewPager作爲我的選項卡適配器。 ViewPager的默認設置是每次最多加載3個頁面或片段。因此,如果用戶從特定標籤移開3個標籤,那麼原始標籤將被銷燬,並且當原始標籤被重新選擇時將再次調用onCreate。

爲了解決這個問題,我只是簡單地添加此行我的構造函數我TabsAdapter類:

mViewPager.setOffscreenPageLimit(NUMBER_OF_TABS - 1); 

這最終確定我遇到的問題,以及一些更是已經來了。

+0

你如何在這些標籤之間切換? – Luksprog

+0

您可以通過滑動切換標籤或單擊操作欄中的標籤。 –

回答

6

要解決這個問題,您必須瞭解ViewPager的工作原理。

當您在ViewPager中設置適配器,例如4 Fragments。我們打電話給| A | B | C | D |


從活動 X您導航到活動 Y其中ViewPager持有上述片段。

X --> Y 
     |--> | A | B | C | D | 

當Y的觀點被渲染,我。ê片段A中所示,

  Y 
     | A | B | 

同時片段在管道中產生。


當您移動到片段 B, Ç在管道中產生, 一個還活着。這被反映在 您在 一個取得

  Y 
    | A | B | C | 

任何變化是呈現。


當您移動到片段 çd在管道中產生還活着。 一個被殺害

  Y 
    | B | C | D | 


當您移動到 d,C被保留, 被殺害。

  Y 
    | C | D | 


當你現在搬回 C,B因爲它是首次創建的新生成的填充數據。

  Y 
    | B | C | D | 

現在,爲了反射具有變化時數據在改變在第二步驟A可用 &可以在下一步驟中被看見。


當你現在搬回 B,A因爲它是首次創建的新生成的填充數據。

  Y 
    | A | B | C | 


ViewPager緩存在兩側相鄰視圖,其是由以實現視圖的任何變化在相鄰屏幕被 不會呈現,除非視圖被重建/強制刷新通過移動到另一個活動或分開移動2個視圖。您遇到相同的&這是ViewPager的默認行爲。

比較A,B,C,d與你的標籤,來解決這個看看Update ViewPager dynamically?

  • 請確保您使用FragmentStatePagerAdapter,而不是FragmentPagerAdapter,因爲它不會殺死片段。