Андроид appwidget listview не обновляется

Я написал AppWidget, который отображает некоторые данные в ListView из ContentProvider, но у меня проблемы с его обновлением. Когда я впервые создаю виджет, он заполняется правильно, но после того, как появился PendingIntent AlarmManager, в ListView не происходит никаких обновлений. Вот код:

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

Странно, когда происходит обновление, работает метод onUpdate () – я вижу вывод из вызова Log.d, но в моем RemoteViewsFactory нет вызова onDataSetChanged (). Даже когда я вызываю notifyAppWidgetViewDataChanged, никакого эффекта.

Это связано с тем, что ваш RemoteViewsFactory кэширует завод, который он создает для каждого идентификатора виджета. Следовательно, когда тот же самый виджет отправляет запрос на создание нового завода (через вашу службу адаптера виджета), возвращается тот же завод. Следовательно, просмотр списка не «обновляется».

Как я работал над этим:

В вашем WidgetProviderClass

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

Где randomNumber – случайное число (публичный статический член вашего класса WidgetProvider).

Затем в вашем классе RemoteViewsFactory выполните:

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

Это «дурачит» Службу, думая, что ей нужно создать Factory для другого виджета, и, следовательно, создает новую фабрику с обновленными значениями, которая привязана к вашему виджету.

Надеюсь это поможет.

Даже у меня была такая же проблема. У этой проблемы есть RemoteView виджета.

Решение. Отправьте трансляцию самому себе и обновите список. Т.е. установите данные в полный вид, а затем отправьте трансляцию на yopurself.

Надеюсь это поможет

Попробуйте динамический номер

В вашем 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); 

И в вашем классе RemoteViewsFactory выполните:

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