2

我在與從ListFragment外部調用restartLoader()有點問題。序列按照Tap的「Add」按鈕進行,該按鈕打開一個Activity - > Enter data - > Tap Save,它啓動一個AsyncTask將數據存儲在服務器上。在數據傳輸成功後,返回到前面的活動 - >讓活動調用運行getLoaderManager()。的restartLoader()的ListFragment中的方法。RestartLoader從FragmentActivity

這樣做總是會創建一個「java.lang.IllegalStateException:Fragment ListsFragment {42481238}」,並且不會附加到Activity「-error」。如果我移動restartLoader(),以它的onResume工作稍微好一點,但我有直接修改連接到ListFragments數據,仍然引發一個IllegalStateException不管其他按鈕。從logcat的

E/AndroidRuntime(29594): java.lang.IllegalStateException: Fragment ListsFragment{42450b18} not attached to Activity 
E/AndroidRuntime(29594):  at android.support.v4.app.Fragment.getLoaderManager(Fragment.java:768) 
E/AndroidRuntime(29594):  at testpager.ListsFragment.resetList(ListsFragment.java:122) 

摘錄錯誤消息我在想什麼?如何從FragmentActivity刷新ListFragment而不觸發此異常?

回答

0

如果我理解正確的話,你有創造,有一個菜單選項,以節省通過活動B.數據裝載機活動A完成活動B已經保存的數據,你要重新啓動在活動A裝載機...我對嗎?

如果是的話,嘗試在活動B這樣做:

public interface onSavedDataListener { 
    void DoneSavingData(); //add parameters if needed 
} 
... //Whatever other code you have 
//This method should be called from your AsyncTask onFinished() method 
public void dataSaved() { //add parameters if needed 
    onSavedDataListener activity = (onSavedDataListener) getActivity(); 
    activity.DoneSavingData(); //make sure you add the same parameters as you did above 
} 
在活動A

然後,你將實現

public class ActivityA extends ListFragment implements onSavedDataListener { 

    ... //your other code here 

    //Add the listener function 
    public void DoneSavingData() { //make sure any parameters you have get added here 
     getLoaderManager().restartLoader(id, args, loadercallback); 
    } 

    ... 

從本質上說,您創建活動B的監聽對象的監聽器在活動A中實施。我希望我是對的,它會幫助你...

+0

順便說一句,如果您使用的是支持包爲以前的SDK向後兼容,你應該調用getSupportLoaderManager(),而不是... – wileyCoyote 2012-07-25 02:06:13

3

你不應該從FragmentActivity刷新ListFragment ...這樣對兩種都Fragment S的基本設計方針(其應該被設計用於複用和不依賴於任何一種具體的活性)和LoaderManager(這是應該屬於單個ActivityFragment)。您應該讓ListFragment改爲實現LoaderManager.LoaderCallbacks<D>接口。

另一方面,Loaders應當在其基礎數據源發生更改時接收通知,通知它們執行新的異步加載並將結果返回給回調的onLoadFinished方法。如果你必須依靠restartLoader獲得最先進的最新數據,那麼你做錯了什麼(即你的ContentObserver沒有被通知將已經暗示了Loader重新查詢其數據變化)。

+0

對不起,我遲到不可原諒的響應。我的項目被擱置了一段時間,但我正在重新鋪設它。 – 2012-12-03 19:59:42

+0

對不起我的不可思議的遲到迴應。我實際上使用LoaderManager.LoaderCallbacks 和基督徒加載程序http://stackoverflow.com/questions/7182485/usage-cursorloader-without-contentprovider 我試圖做一個實現,使用一個加載程序,但不一定包括整個內容提供商自我只會在我自己的應用程序中運行它。我讀過這個http://stackoverflow.com/a/4245672/975641,似乎提供者可能是矯枉過正。 有什麼想法?可能是這是一個全新的問題。只是試圖澄清。 – 2012-12-03 20:12:45

+3

'Commonsware'總是會談論有關'ContentProvider'的垃圾:P。我們的觀點是,CP對於不共享數據的應用程序是過度殺傷力的......我幾乎同意這一點,*但是*我真正喜歡的關於CP +加載程序組合的一點是它配備了全局通知系統。也就是說,如果在CP查詢方法中的光標上調用'setNotificationUri()',並在插入/刪除方法中調用notifyUri(),那麼將在整個* entire *應用程序中通知遊標內容更改(即no投票需要!)。 ContentResolver沒有簡單的方法來做到這一點。 – 2012-12-06 16:07:37