Actualizar una vista de lista en un fragmento de un receptor de difusión

Tengo que actualizar un listview en un fragmento si un archivo se descarga con éxito. Así que en el BroadcastReceiver de mi gestor de descargas registro este nuevo receptor de difusión:

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

Y en mi fragmento en onCreateView agrego el siguiente código para registrar el receptor:

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

entonces:

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

Y al final:

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

Tengo que añadir dos de estos receptores de la difusión para dos Fragmento diferente. En el primero, todo funciona bien. Si en la aplicación el usuario está en el fragmento, se actualiza, mientras que en el segundo fragmento tengo estos errores:

 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 sample.actionscontentview.fragment.ContentsFragment$1@418e0850 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 

Y el código es el mismo! No puedo entender por qué no funciona. Dice que hay un problema con populatelistView, pero la misma función funciona bien dentro del fragmento si no se llama desde el receptor de difusión.

La única diferencia que puedo pensar entre estos dos fragmentos es que aquel en el que funciona la actualización es el primero que se abre cuando se inicia la aplicación.

Intente usar EventBus por GreenRobot https://github.com/greenrobot/EventBus

Cuando el archivo se descarga correctamente, publica un evento

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

Su fragmento se registrará para recibir eventos, preferiblemente en el método onStart ()

 EventBus.getDefault().register(this); 

Y recibirá eventos en el método onEvent:

 public void onEvent(Data.State) {} 

Y entonces usted puede actualizar su listview fácilmente. También cancela el registro de recibir eventos en el método onStop (). Puede guardar los datos en su aplicación o almacenados. Es muy fácil y una buena solución. Espero eso ayude. Puede registrar tantos fragmentos como desee para este evento, así que una vez que el EventBus publique el evento, todos los fragmentos disponibles registrados recibirán este evento.

Sé que esto es viejo, pero en caso de que pueda ayudarme a salir de su experiencia que por favor hacer en mi problema:

He publicado una pregunta similar aquí: Broadcast receptores y Fragmentos . Usted puede buscar la solución que hice, aunque creo que debería haber una mejor manera de hacer esto.

Algunos proponen que todas las emisiones lleguen a la Actividad que alberga los fragmentos ya través de un oyente informen a los fragmentos que deben actualizar la vista basándose en lo recibido. Esto podría ser un enfoque mejor, pero también podría todavía implicar punteros nulos comprobando la vista de los fragmentos.

Aquí está el post detallado de cómo resolví esto.

Sólo tener la instancia de MainActivity en el receptor de Broadcast y luego trabajar con él

  • OnItemLongClickListener no funciona en una vista de lista personalizada
  • Fuente personalizada para Android listview
  • Android ListView alpha scroller para desplazamiento rápido de larga lista
  • Forzar un elemento ListView para permanecer "presionado" después de haber hecho clic?
  • Cuadro de lista con casillas de verificación en cuadro de diálogo de alerta
  • Android: BaseAdapter no muestra elementos
  • ¿Cómo llenar un ListView con una ArrayList?
  • ¿Cómo puedo añadir una vista de pie de página a una lista secundaria en una lista de extensibilidadListActivity?
  • NotifyDataSetChange no funciona desde un adaptador personalizado
  • EditText en ListView necesita ajustarResize pero tiene error de foco perdidoso
  • Pasar de una vista de lista a una vista de cuadrícula
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.