2013-03-15 60 views
10

如果文件成功下載,我必須更新片段中的列表視圖。所以在我的下載管理器的廣播接收器我註冊這個新的廣播接收器:從廣播接收器更新片段中的列表視圖

Intent intent = new Intent(); 
intent.setAction("CONTENTS_NOTIFICATION"); 
context.sendBroadcast(intent); 

而且在我onCreateView片段我添加以下代碼以註冊接收器:

IntentFilter filter = new IntentFilter("CONTENTS_NOTIFICATION"); 
getActivity().getApplicationContext().registerReceiver(myReceiver, filter); 

則:

private BroadcastReceiver myReceiver = new BroadcastReceiver() { 

     @Override 
     public void onReceive(Context context, Intent intent) { 

      SQLiteDatabase db = DatabaseManager.getInstance(getActivity()).getWritableDatabase(); 
       c = SelectedExperience.getSelectedExperiences(db); 

       String id_esperienza = "Selected Experience"; 

       if (c.getCount() != 0) { 
        id_esperienza = c.getString(c.getColumnIndex(SelectedExperience.ID_ESPERIENZA)); 
       } 

      populateListview(v, id_esperienza); 

     } 
    }; 

,並在年底:

public void onDestroyView() { 
     super.onDestroyView(); 
     getActivity().getApplicationContext().unregisterReceiver(myReceiver); 
} 

我必須爲兩個不同的片段添加兩個這些廣播接收器。在第一個,一切正常。如果應用程序的用戶是在片段,它更新,而在第二個片段我得到了這些錯誤:

03-15 07:32:40.474: E/AndroidRuntime(1692): FATAL EXCEPTION: main 
03-15 07:32:40.474: E/AndroidRuntime(1692): java.lang.RuntimeException: Error receiving broadcast Intent { act=CONTENTS_NOTIFICATION flg=0x10 } in [email protected] 
03-15 07:32:40.474: E/AndroidRuntime(1692):  at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:768) 
03-15 07:32:40.474: E/AndroidRuntime(1692):  at android.os.Handler.handleCallback(Handler.java:725) 
03-15 07:32:40.474: E/AndroidRuntime(1692):  at android.os.Handler.dispatchMessage(Handler.java:92) 
03-15 07:32:40.474: E/AndroidRuntime(1692):  at android.os.Looper.loop(Looper.java:137) 
03-15 07:32:40.474: E/AndroidRuntime(1692):  at android.app.ActivityThread.main(ActivityThread.java:5191) 
03-15 07:32:40.474: E/AndroidRuntime(1692):  at java.lang.reflect.Method.invokeNative(Native Method) 
03-15 07:32:40.474: E/AndroidRuntime(1692):  at java.lang.reflect.Method.invoke(Method.java:511) 
03-15 07:32:40.474: E/AndroidRuntime(1692):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795) 
03-15 07:32:40.474: E/AndroidRuntime(1692):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562) 
03-15 07:32:40.474: E/AndroidRuntime(1692):  at dalvik.system.NativeStart.main(Native Method) 
03-15 07:32:40.474: E/AndroidRuntime(1692): Caused by: java.lang.NullPointerException 
03-15 07:32:40.474: E/AndroidRuntime(1692):  at sample.actionscontentview.fragment.ContentsFragment.populateListview(ContentsFragment.java:194) 
03-15 07:32:40.474: E/AndroidRuntime(1692):  at sample.actionscontentview.fragment.ContentsFragment.access$0(ContentsFragment.java:111) 
03-15 07:32:40.474: E/AndroidRuntime(1692):  at sample.actionscontentview.fragment.ContentsFragment$1.onReceive(ContentsFragment.java:107) 
03-15 07:32:40.474: E/AndroidRuntime(1692):  at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:758) 
03-15 07:32:40.474: E/AndroidRuntime(1692):  ... 9 more 

和代碼是一樣的!我無法弄清爲什麼它不起作用。它說populatelistView存在問題,但如果不從廣播接收器調用,那麼相同的函數在片段內工作正常。

我可以在此兩個片段之間的想法唯一的區別是在更新工作之一是當應用程序啓動的第一個打開。

+1

什麼是行號。 194併發布代碼爲populateListView – Atrix1987 2013-03-15 07:42:46

+0

我的不好...錯誤是在populatelistView,特別是我傳遞錯誤的觀點!所以代碼工作正常! – phcaze 2013-03-15 08:16:58

回答

4

嘗試通過GreenRobot使用EventBus https://github.com/greenrobot/EventBus

當你的文件被成功地下載您發佈事件

EventBus.getDefault().post(YourData.Downloaded); 

您的片段將用於接收註冊事件,最好在onStart()方法

EventBus.getDefault().register(this); 

它將在onEvent方法中接收事件:

public void onEvent(Data.State) {} 

然後你可以很容易地更新你的列表視圖。您還可以通過onStop()方法取消註冊接收事件。您可以將數據保存在應用程序中或存儲。這是一個非常簡單而且很好的解決方案。希望能幫助到你。您可以根據需要爲此事件註冊許多片段,因此一旦EventBus發佈該事件,爲其註冊的所有可用片段都將收到此事件。

0

我知道這是舊的,但如果你能幫助我從你的經歷比請我的問題做:

我已經在這裏張貼了類似的問題:Broadcast receivers and Fragments。您可以查找我所做的解決方法,但我認爲應該有更好的方法來做到這一點。

一些建議所有的廣播去哪個託管片段,並通過一個傾聽者告訴他們應該更新基於什麼已收到該視圖的片段的活動。這可能是更好的方法,但它也可能涉及空指針檢查片段的視圖。