studio programacion herramientas fundamentos con avanzado aplicaciones android listview widget android-appwidget

programacion - manual de android en pdf



android appwidget listview no se actualiza (3)

Incluso yo tuve el mismo problema. RemoteView of widget tiene este problema.

Solución: envíe transmisiones a usted mismo y actualice la lista nuevamente. es decir, establece los datos en tu vista completa y luego envía la transmisión a ti mismo.

Espero que esto ayude

Escribí un AppWidget que muestra algunos datos en un ListView de ContentProvider, pero tengo problemas para actualizarlo. Cuando creo el widget por primera vez, se llena correctamente, pero después de que llega el PendingIntent de AlarmManager, no se produce ninguna actualización en el ListView. Aquí está el código:

Intent update = new Intent(context, MenuWidgetProvider.class); update.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE); update.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds); PendingIntent pIUpdate = PendingIntent.getBroadcast(context, 0, update, 0); ((AlarmManager) context.getSystemService(Context.ALARM_SERVICE)). set(AlarmManager.RTC, nextTime.toMillis(false), pIUpdate); Log.d(TAG, "updating: " + dmt.mealName); for (int i = 0; i < appWidgetIds.length; ++i) { int widgetId = appWidgetIds[i]; RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_menu); // meal name views.setTextViewText(R.id.widget_locname, prefs.getString(PREF_WIDGET_LOCNAME, "")); // adapter Intent adapter = new Intent(context, MenuWidgetAdapterService.class); adapter.putExtra(EXTRA_LOCATIONID, prefs.getInt(PREF_WIDGET_LOCID, -1)); adapter.putExtra(EXTRA_MEALNAME, dmt.mealName); adapter.putExtra(EXTRA_DATE, dmt.date.toString()); views.setRemoteAdapter(R.id.widget_list, adapter); // update manager.updateAppWidget(widgetId, views); } super.onUpdate(context, manager, appWidgetIds);

Lo extraño es que cuando ocurre la actualización, se ejecuta el método onUpdate (), veo el resultado de la llamada Log.d, pero no hay ninguna llamada a onDataSetChanged () en mi RemoteViewsFactory. Incluso cuando llamo notifyAppWidgetViewDataChanged, no hay efecto.


Esto se debe a que su RemoteViewsFactory almacena en caché la fábrica que crea para cada ID de widget. Por lo tanto, cuando el mismo widget envía una solicitud para crear una nueva fábrica (a través de su Servicio de adaptador de widgets), se devuelve la misma fábrica. Por lo tanto, la vista de lista no está "actualizada".

Cómo trabajé alrededor de esto:

En tu WidgetProviderClass

adapter.setData(Uri.fromParts("content", String.valueOf(appWidgetIds[i]+randomNumber), null));

donde randomNumber es un número aleatorio (un miembro estático público de su clase WidgetProvider).

Luego, en su clase RemoteViewsFactory, haga lo siguiente:

appWidgetId = Integer.valueOf(intent.getData().getSchemeSpecificPart()) - WidgetProvider.randomNumber;

Esto "engaña" al Servicio al pensar que tiene que crear una Fábrica para otro widget, y por lo tanto, crea una nueva fábrica con los valores actualizados, que se adjunta a su widget.

Espero que esto ayude.


Prueba el número dinámico

En su WidgetProviderClass:

int randomNumber=(int)(Math.random()*1000); intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId+randomNumber); intent.setData(Uri.fromParts("content", String.valueOf(appWidgetId), null)); intent.putExtra("random",randomNumber ); intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME))); rv = new RemoteViews(context.getPackageName(), R.layout.widget_layout);

Y en su clase RemoteViewsFactory, haga lo siguiente:

AppWidgetId = Integer.valueOf(intent.getData().getSchemeSpecificPart());