安卓桌面小部件:RemoteViews的setRemoteAdapter(...)方法在API 11+上不起作用

9

在更新方法中,调用

remoteViews.setRemoteAdapter(id, R.id.listview, intent)

以便将适配器应用于小部件中的列表视图。

小部件头部有一个按钮,可以更改列表视图显示的数据集(例如,假设为电子邮件小部件中的收件箱、发件箱、星标等)。当我点击该按钮时,它会带用户进入一个活动,让他们选择要显示的数据集。当选择完成后,运行以下代码:

Intent intent = new Intent(this, WidgetReceiver.class);
intent.setAction("android.appwidget.action.APPWIDGET_UPDATE");
intent.putExtra("notify", true);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, new int[] {R.xml.widget_provider});
sendBroadcast(intent);

这成功地调用了小部件的AppWidgetProvider类中的onUpdate方法。然而,如果我在不同类型的数据集之间切换,经过2-3个偏好更改后,setRemoteAdapter方法就会停止工作。我已经广泛记录了这个过程,但是这个方法应该调用一个服务,然后加载RemoteViewsService.RemoteViewsFactory类来填充小部件及其适配器,但实际上并没有执行任何这些操作。前几次更改偏好时,它像预期的那样工作。但之后就不行了。
有人知道这里出了什么问题吗?
3个回答

15

很奇怪,但我找到了一个解决方法。Android 似乎会缓存您在 onUpdate 方法中使用的意图。如果您重新发送看起来相同的意图,则不会像您期望的那样执行。

解决方案:有一个静态迭代整数,将其包含为意图附加项之一。这对我解决了问题。

Intent intent = new Intent(context, WidgetService.class);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, currentWidgetId);
intent.putExtra("random", randomNumber);
randomNumber++;
intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME)));

哦,安卓...


嗨,JMRboosties。你能否友好地分享一下你的代码?我也在尝试将ListView放入主屏幕小部件中,并添加一个带有几个按钮的标题(可以通过这些按钮更改ListView显示的数据集)。我在注册标题按钮的点击事件和更新ListView方面遇到了困难。谢谢。 - Hubert
1
这似乎是所有更新都会发生的情况 - 最终Android会感到厌烦,只是假设您拥有正确的结果:/ 感谢@JMRboosties :) - Graeme
当您升级并且应用程序被新版本替换时,这似乎不起作用,有什么建议可以解决吗? - 2cupsOfTech

2

我以前遇到过这个问题。使用随机数的方法也帮助了我。


2
很遗憾,建议的方法对我不起作用。有效的方法是调用appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetIds, R.id.list_view); 在我的AppWidgetProvider类中有一个静态方法,每当我想要更新小部件数据时就会调用它。我在该方法中调用了notifyAppWidgetViewDataChanged,一切正常。现在小部件可以正确更新列表数据。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接