android appwidget listview没有更新

时间:2013-01-23 18:36:40

标签: android listview widget android-appwidget

我编写了一个AppWidget,它从ContentProvider中显示ListView中的一些数据,但是我无法更新它。当我第一次创建窗口小部件时,它会正确填充,但在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,也没有效果。

3 个答案:

答案 0 :(得分:13)

这是因为您的RemoteViewsFactory缓存了为每个窗口小部件ID创建的工厂。因此,当相同的小部件发送创建新工厂的请求(通过Widget适配器服务)时,将返回相同的工厂。因此,列表视图不会“更新”。

我是如何解决的:

在你的WidgetProviderClass

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

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

然后在RemoteViewsFactory类中执行:

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

这使“服务”误认为它必须为另一个小部件创建一个工厂,因此,创建一个带有更新值的新工厂,该工厂附加到您的小部件。

希望这有帮助。

答案 1 :(得分:0)

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

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

希望这有帮助

答案 2 :(得分:0)

尝试动态编号

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