7

我的应用小部件以多种模式运行。对于这些模式中的每一种,我都创建了一个RemoteViewsFactory. 为了在模式之间切换,我向我的AppWidgetProvider. 收到后,我创建了'sRemoteViews并将其传递给AppWidgetManager's updateAppWidget()。要RemoteViewsFactory为集合视图设置 a,我调用RemoteViews' setRemoteAdapter()

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

R.id.widget_view_flipper是集合视图,intent是为了RemoteViewsService构建合适的工厂。

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

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

4

2 回答 2

13

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

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

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

其中 rv 是新的 RemoteViews。

旧的 RemoteViews 缓存在 AppWidgetHostView 中,这样我们就可以摆脱缓存的数据。

于 2012-10-22T18:25:42.097 回答
4

就我而言,我不需要调用它两次,但我发现我的 listView 项目没有相应地更新。我必须调整小部件的大小才能看到更改。因此,除了进行上述调用之外,我还对列表进行了以下更新

int[] widgetIds = mAppWidgetManager.getAppWidgetIds(mComponentName);
mAppWidgetManager.notifyAppWidgetViewDataChanged( widgetIds, R.id.widget_listview );
于 2018-01-06T22:48:06.967 回答