2013-12-12 30 views
7

給定一個使用加載器從數據庫加載(很多)數據的片段。Android片段 - 使用活動的loadermanager而不是Fragment的。好嗎?

問題:

我有當用戶從標籤抱着它移開,當用戶回來到該選項卡重新創建它這破壞了片段尋呼機適配器。由於這種娛樂,每次都會創建一個新的加載器,並且每次都會加載數據。

問:

爲了避免重現裝載機每次創建片段,它是確定在片段的onActivityCreated方法使用getActivity.getSupportLoaderManager.initLoader(loaderId, null, false)

我試過了,測試它,它似乎工作正常。但我不相信這是對的。

+0

我看不出這種方法的問題。確保你使用每個片段的唯一ID(除非你可以重複使用同一個裝載器) –

+0

我已經確認這個ID是唯一的。它感覺不對。因爲當加載器被創建時,片段將自己註冊爲回調函數,如果系統已經銷燬了片段,loader會重新加載數據並嘗試調用'onLoadFinished()'方法? – 500865

+0

'onLoadFinished'將在Activity中被調用,它將不得不查找片段。它可能存在或不存在(在這種情況下,只是忽略結果)。無論如何,我現在留下了正確的答案。 –

回答

2

其實,檢查源代碼,你最終也會這樣做。

Fragment.getLoaderManager:

/** 
* Return the LoaderManager for this fragment, creating it if needed. 
*/ 
public LoaderManager getLoaderManager() { 
    if (mLoaderManager != null) { 
     return mLoaderManager; 
    } 
    if (mActivity == null) { 
     throw new IllegalStateException("Fragment " + this + " not attached to Activity"); 
    } 


    mCheckedForLoaderManager = true; 
    mLoaderManager = mActivity.getLoaderManager(mWho, mLoadersStarted, true); 
    return mLoaderManager; 
} 

mWho基本片段ID。

final void setIndex(int index, Fragment parent) { 
    mIndex = index; 
    if (parent != null) { 
     mWho = parent.mWho + ":" + mIndex; 
    } else { 
     mWho = "android:fragment:" + mIndex; 
    } 
} 

Activity.getLoaderManager()不同的是,誰將會是(root)

因此,即使你可以做你的要求,直接調用它的碎片可能是一個更好的方法

免責聲明:我只檢查了最新版本的源代碼,但我不希望它是非常不同的

0

請問爲什麼你根本不保留碎片?看來你需要的是在Fragment中創建Loader並用setRetainInstance(true)創建片段。 在這種情況下,請記住在添加片段時提供TAG。 通過這種方式,片段可以在活動配置更改中生存,只有視圖將被重新創建,使您的裝載器保持活動狀態。

相關問題