2013-03-15 12 views
10

Ich muss ein Listview in einem Fragment aktualisieren, wenn eine Datei erfolgreich heruntergeladen wird. Also in meinem Download-Manager des BroadcastReceiver registriere ich diese neuen Rundfunkempfänger:Eine Listenansicht in einem Fragment von einem Broadcast-Empfänger aktualisieren

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

Und in meinem Fragmente in onCreateView ich den folgenden Code, um den Empfänger zu registrieren:

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

dann:

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); 

     } 
    }; 

und am Ende:

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

Ich muss zwei dieser Rundfunkempfänger für zwei verschiedene Fragmente hinzufügen. Auf der ersten funktioniert alles gut. Wenn in der Anwendung der Benutzer auf dem Fragment ist, aktualisiert sie, während auf dem zweiten Fragment ich diese Fehler bekam:

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 

und der Code ist das gleiche! Ich kann nicht verstehen, warum es nicht funktioniert. Es besagt, dass es ein Problem mit populatelistView gibt, aber die gleiche Funktion funktioniert gut innerhalb des Fragments, wenn es nicht vom Broadcast-Empfänger aufgerufen wird.

Der einzige Unterschied, den ich zwischen diesen beiden Fragmenten denken kann, ist, dass derjenige, in dem das Update funktioniert, der erste ist, der geöffnet wird, wenn die Anwendung gestartet wird.

+1

was ist die Zeilennr. 194 und poste den Code für populateListView – Atrix1987

+0

Mein böser ... Der Fehler war in populatelistView, insbesondere habe ich die falsche Sicht übergeben !! Also funktioniert der Code gut! – phcaze

Antwort

4

Versuchen EventBus von Greenrobot https://github.com/greenrobot/EventBus

Wenn Ihre Datei erfolgreich heruntergeladen Sie Beiträge verfassen ein Ereignis

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

Ihr Fragment zur Aufnahme Events registrieren, vorzugsweise in onStart() -Methode

EventBus.getDefault().register(this); 
mit

Und es wird Ereignisse in OnEvent-Methode empfangen:

public void onEvent(Data.State) {} 

und dann können Sie Ihre ListView einfach aktualisieren. Sie heben auch die Registrierung von Ereignissen in der onStop() -Methode auf. Sie können die Daten in Ihrer Anwendung aufbewahren oder speichern. Es ist sehr einfach und eine nette Lösung. Ich hoffe es hilft. Sie können für dieses Ereignis so viele Fragmente registrieren, wie Sie möchten. Sobald der EventBus das Ereignis veröffentlicht, erhalten alle verfügbaren Fragmente dieses Ereignis.

0

Ich weiß, das ist alt, aber für den Fall, können Sie mir von Ihrer Erfahrung helfen, als Sie an meinem Problem tun:

ich eine ähnliche Frage hier gepostet haben: Broadcast receivers and Fragments. Sie können nach der Problemumgehung suchen, die ich getan habe, obwohl ich denke, dass es einen besseren Weg geben sollte, dies zu tun.

Einige schlagen vor, dass alle Broadcasts zu der Aktivität gehen, die die Fragmente hostet und durch einen Listener den Fragmenten mitteilt, dass sie die Ansicht basierend auf dem, was empfangen wurde, aktualisieren sollen. Dies könnte ein besserer Ansatz sein, aber es könnte auch immer noch Nullzeiger enthalten, die nach der Ansicht der Fragmente suchen.

Verwandte Themen