我的应用小部件在多种模式下运行。对于每种模式,我创建了RemoteViewsFactory
。要在模式之间切换,我会向我的AppWidgetProvider
发送一个意图。收到后,我会创建RemoteViews
并将其传递给AppWidgetManager
updateAppWidget()
。要为集合视图设置RemoteViewsFactory
,请致电RemoteViews
' setRemoteAdapter()
:
rv.setRemoteAdapter(appWidgetId, R.id.widget_view_flipper, intent);
R.id.widget_view_flipper
是集合视图,intent
用于RemoteViewsService
构建适当的工厂。
编辑:我编辑了这个问题,因为我找出了最初描述的问题。现在,当我更换工厂时,在更改后调用新工厂的getViewAt()
,但集合视图中的元素根本不会更新!这会怎么样?
目前我唯一能想到的是,我可以在工厂更换后延迟调用AppWidgetManager的notifyAppWidgetViewDataChanged,它会导致视图中的元素以丑陋的闪烁进行更新。 / p>
答案 0 :(得分:11)
经过半天的挖掘,我想出了一个解决方法。
当我需要更新窗口小部件并替换工厂时,请在AppWidgetProvider中执行以下操作:
appWidgetManager.updateAppWidget(appWidgetIds[i], null);
appWidgetManager.updateAppWidget(appWidgetIds[i], rv);
其中rv是新的RemoteViews。
旧的RemoteViews缓存在AppWidgetHostView中,这样我们就可以摆脱缓存的数据。
答案 1 :(得分:1)
在我的情况下,我不需要调用它两次,但我发现我的listView项目没有相应更新。我不得不调整窗口小部件的大小以查看更改。因此,除了进行上述调用之外,我还对列表进行了以下更新
int[] widgetIds = mAppWidgetManager.getAppWidgetIds(mComponentName);
mAppWidgetManager.notifyAppWidgetViewDataChanged( widgetIds, R.id.widget_listview );