在app widget更新上替换RemoteViewsFactory

时间:2012-10-19 18:10:29

标签: android android-appwidget

我的应用小部件在多种模式下运行。对于每种模式,我创建了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>

2 个答案:

答案 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 );