在应用程序小部件更新时更换RemoteViewsFactory

9

我的应用小部件有多种模式。对于每种模式,我创建了一个RemoteViewsFactory。为了在不同的模式之间切换,我向AppWidgetProvider发送一个意图。收到意图后,我创建RemoteViews并将其传递给AppWidgetManagerupdateAppWidget()方法。要为集合视图设置RemoteViewsFactory,我调用RemoteViewssetRemoteAdapter()方法:

rv.setRemoteAdapter(appWidgetId, R.id.widget_view_flipper, intent);

R.id.widget_view_flipper是一个集合视图,intent用于RemoteViewsService构建适当的工厂。

编辑:我编辑了问题,因为我找到了最初描述的问题。现在的问题是,当我更改工厂时,新工厂的getViewAt()被调用,但集合视图中的元素根本不会更新!这是怎么回事?

目前我想到的唯一解决方法是,在工厂替换后延迟调用AppWidgetManager的notifyAppWidgetViewDataChanged,这会导致视图中的元素更新并出现丑陋的闪烁。


顺便问一下,你如何在运行时更改工厂?谢谢。 - Evi Song
2个回答

13

经过半天的挖掘,我想出了一个解决方法。

当我需要更新小部件并替换工厂时,在AppWidgetProvider中执行以下操作:

appWidgetManager.updateAppWidget(appWidgetIds[i], null);
appWidgetManager.updateAppWidget(appWidgetIds[i], rv);  

rv是新的RemoteViews。

旧的RemoteViews被缓存在AppWidgetHostView中,这样我们可以清除缓存数据。


3
惊人简单的解决方案。谷歌真应该把这当作一个漏洞来处理。 - Evi Song

4
在我的情况下,我不需要调用它两次,但我发现我的ListView项目没有相应地更新。我必须重新调整小部件才能看到更改。因此,除了进行上述调用外,我还对列表进行了以下更新。
int[] widgetIds = mAppWidgetManager.getAppWidgetIds(mComponentName);
mAppWidgetManager.notifyAppWidgetViewDataChanged( widgetIds, R.id.widget_listview );

太棒了,伙计! - Acuna
1
我为你感到高兴,我的朋友。 - Juan Mendez

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