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:
- Cambiar la altura del diseño relativo con la misma velocidad que el dedo del usuario Se mueve en el diseño
- Listview no se puede hacer clic cuando se puede seleccionar la vista de texto dentro de esa vista de lista
- cómo mostrar los datos json obtenidos en listview usando baseadapter
- Rellenar Listview de JSON
- El conjunto de Android View.GONE no libera espacio en listview
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.
- No se puede utilizar SimpleAdapter en un ListFragment
- Android: ListView con un modelo de datos complejos
- Android listview muestra datos falsos después de desplazarse (adaptador personalizado)
- Posición incorrecta de elementos después de usar un customAdapter
- Mantenimiento de los estados de la casilla de verificación en listview con CursorAdapter
- Android: Centrar elementos en un ListVIew
- Animación de encabezados de un ListView dando ClassCastException
- ¿Cómo inhabilito el overscroll y el rebote en una lista de android?
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
- SoapFault – código de error: '1062' faultstring: 'Método de envío no está disponible'
- Habilitar registro DEBUG en Blu-R1 HD (teléfono Amazon)