android appwidget listview不更新

我写了一个AppWidget,它显示ContentProvider的一个ListView中的一些数据,但是我更新时遇到了麻烦。 当我第一次创build小部件时,它会正确填充,但在AlarmManager的PendingIntent到达后,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,也没有任何作用。

Solutions Collecting From Web of "android appwidget listview不更新"

这是因为您的RemoteViewsFactorycaching了它为每个小部件ID创build的工厂。 因此,当相同的小部件发送创build新工厂的请求(通过Widget Adapter Service)时,将返回相同的工厂。 因此,列表视图不是“更新”的。

我是如何解决它的:

在你的WidgetProviderClass中

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

其中randomNumber是一个随机数(WidgetProvider类的公共静态成员)。

然后在你的RemoteViewsFactory类中,执行:

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

这个“愚蠢”的服务,认为它必须为另一个小部件创build一个工厂,因此,创build一个新的工厂与更新的值,这是附加到您的小部件。

希望这可以帮助。

即使我有同样的问题。 widget的RemoteView有这个问题。

解决scheme:向自己发送广播并重新刷新列表。 即将数据设置为您的完整视图,然后将广播发送给yopurself。

希望这可以帮助

试试dynamic号码

在你的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());