2013-03-15 10 views
10

Devo aggiornare un listview in un frammento se un file viene scaricato con successo. Quindi, in BroadcastReceiver mio download manager posso registrare questo nuovo ricevitore trasmissione:Aggiornare un listview in un frammento da un ricevitore di broadcast

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

E nel mio frammento in onCreateView aggiungo il seguente codice per registrare il ricevitore:

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

poi:

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

     } 
    }; 

e alla fine:

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

Devo aggiungere due di questi ricevitori per due frammenti diversi. Sul primo, tutto funziona bene. Se l'applicazione l'utente si trova sul frammento, aggiorna, mentre al secondo frammento ho ottenuto questi errori:

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 

e il codice è lo stesso! Non capisco perché non funzioni. Dice che c'è un problema con populatelistView ma la stessa funzione funziona bene all'interno del frammento se non viene chiamata dal ricevitore broadcast.

L'unica differenza che posso pensare tra questi due frammenti è che quello in cui funziona l'aggiornamento è il primo aperto all'avvio dell'applicazione.

+1

cos'è la linea n. 194 e inserisci il codice per populateListView – Atrix1987

+0

Il mio male ... L'errore era in populatelistView, in particolare stavo passando la vista sbagliata !! Quindi il codice funziona bene! – phcaze

risposta

4

Prova utilizzando EventBus da GreenRobot https://github.com/greenrobot/EventBus

Quando il file è successo scaricato si registra un evento

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

tuo frammento registrerà per la ricezione di eventi, preferibilmente in onStart metodo()

EventBus.getDefault().register(this); 

E riceverà eventi nel metodo onEvent:

public void onEvent(Data.State) {} 

e quindi è possibile aggiornare facilmente il listview. Si annulla anche la registrazione degli eventi nel metodo onStop(). È possibile conservare i dati nell'applicazione o memorizzati. È molto semplice e una buona soluzione. Spero che sia d'aiuto. Puoi registrare tutti i frammenti che vuoi per questo evento, quindi una volta che EventBus pubblica l'evento, tutti i frammenti disponibili registrati riceveranno questo evento.

0

So che questo è vecchio, ma nel caso in cui voi mi può aiutare dalla vostra esperienza di si prega di fare il mio problema:

ho postato una domanda simile qui: Broadcast receivers and Fragments. Puoi cercare la soluzione alternativa che ho fatto, anche se penso che ci dovrebbe essere un modo migliore per farlo.

Alcuni propongono che tutte le trasmissioni passino all'Attività che ospita i frammenti e attraverso un listener dicano ai frammenti che devono aggiornare la vista in base a ciò che è stato ricevuto. Questo potrebbe essere un approccio migliore ma potrebbe anche coinvolgere i puntatori nulli che controllano la visualizzazione dei frammenti.

Problemi correlati