Android 在应用程序小部件更新中替换RemoteViewsFactory

Android 在应用程序小部件更新中替换RemoteViewsFactory,android,android-appwidget,Android,Android Appwidget,我的应用程序小部件可以在多种模式下运行。对于每种模式,我都创建了一个RemoteViewsFactory。要在模式之间切换,我将意向发送到我的AppWidgetProvider。收到后,我创建远程视图,并将其传递给AppWidgetManager的updateAppWidget()。要为集合视图设置RemoteViewsFactory,我调用RemoteViews“setRemoteAdapter(): R.id.widget\u view\u flipper是集合视图,intent用于Remo

我的应用程序小部件可以在多种模式下运行。对于每种模式,我都创建了一个
RemoteViewsFactory
。要在模式之间切换,我将意向发送到我的
AppWidgetProvider
。收到后,我创建
远程视图
,并将其传递给
AppWidgetManager
updateAppWidget()
。要为集合视图设置
RemoteViewsFactory
,我调用
RemoteViews
setRemoteAdapter()

R.id.widget\u view\u flipper
是集合视图,
intent
用于
RemoteViewsService
构建适当的工厂

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


现在我唯一想到的是,我可以在工厂更换后延迟调用AppWidgetManager的notifyAppWidgetViewDataChanged,这会导致视图中的元素更新为丑陋的闪烁。

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

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

appWidgetManager.updateAppWidget(appWidgetIds[i], null);
appWidgetManager.updateAppWidget(appWidgetIds[i], rv);  
其中rv是新的RemoteView


旧的RemoteView缓存在AppWidgetHostView中,这样我们就可以删除缓存的数据。

在我的例子中,我不需要调用它两次,但我发现我的listView项没有相应地更新。我必须调整小部件的大小才能看到变化。因此,除了打上面的电话之外,我还对列表进行了以下更新

int[] widgetIds = mAppWidgetManager.getAppWidgetIds(mComponentName);
mAppWidgetManager.notifyAppWidgetViewDataChanged( widgetIds, R.id.widget_listview );

非常简单的解决方案。谷歌真的应该把这当作一个bug来对待。顺便问一下,你如何在运行时改变你的工厂?谢谢,太棒了,伙计!我为你感到高兴,我的朋友
int[] widgetIds = mAppWidgetManager.getAppWidgetIds(mComponentName);
mAppWidgetManager.notifyAppWidgetViewDataChanged( widgetIds, R.id.widget_listview );