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

  • Android: visualización de lista inversa como mensaje
  • Dynamic Linkify Text en ListView - Error: no se encontró ninguna intención con datos: url especificada
  • ¿Cómo inhabilito el overscroll y el rebote en una lista de android?
  • No puede ver datos Sqlite con adaptador simple
  • Mostrar menú contextual bajo demanda en Android
  • Cómo obtener todos los elementos seleccionados de un ListView?
  • Arrastrar y soltar la clasificación de adaptador de cursor y adaptador de lista
  • Buggy ListView me hace triste
  • Android listviews: vistas de encabezado y pie de página
  • Artículos de Android ListView que no llenan el ancho
  • Aceleración de hardware en ListView
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.