我意识到,如果主页小部件列表视图中只有1个项目,则会出现闪烁问题,如果我们执行
appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetId, android.R.id.list_view);
请注意,如果主页小部件列表视图中有2个或更多项目,问题就会消失?!
注意,我已将小部件的大小调整为4x4。 (尺寸无关紧要。即使我使用4x2也能观察到闪烁)
我使用 WeatherListWidget 作为示例
中如果我们要改变
sData.add(new WeatherDataPoint("Monday", 13));
sData.add(new WeatherDataPoint("Tuesday", 1));
...
sData.add(new WeatherDataPoint("Sunday", 27));
单身
sData.add(new WeatherDataPoint("Monday", 13));
闪烁问题很容易看出来。 (按右上角的刷新按钮)
如果我仔细观察,我怀疑我看到了#34;正在加载......"其中的文字如
中所述Homescreen widget, listView shows "Loading"
我是否知道为什么只有1个列表视图项才会出现问题?有没有解决方法来解决这个问题?
答案 0 :(得分:0)
我知道这已经过时了,但是当列表中只有一个项目时,通过为列表中的第一个项目重复使用相同的RemoteViews实例以及“加载视图”,我能够解决闪烁问题。通过覆盖getLoadingView()来返回它。
答案 1 :(得分:0)
您可以直接使用代码中的AppWidgetManager删除闪烁,而不是使用ACTION_APPWIDGET_UPDATE发送广播。
首先,您需要获取窗口小部件实例的ID。然后重用代码只需创建YourAppWidgetProvider的实例并调用它的onUpdate()方法。
int[] ids = appWidgetManager.getAppWidgetIds(
new ComponentName(context, YourAppWidgetProvider.class));
YourAppWidgetProvider provider = new YourAppWidgetProvider();
provider.onUpdate(context, appWidgetManager, ids);
它不是最干净的解决方案,但它会消除闪烁效应。
答案 2 :(得分:0)
我有同样的问题。 您可以使用以下方法。 首先,在您的课程中声明RemoteView实例。
RemoteViews rv;
第二,在getViewAt(int位置),通过新的RemoteView()创建一个实例。
@Override
public RemoteViews getViewAt(int position) {
...
rv = new RemoteViews(mContext.getPackageName(), R.layout.grid_view_item);
...
}
第三,在getLoadingView()重用实例rv中。
@Override
public RemoteViews getLoadingView() {
return rv;
}
默认的加载视图“显示加载”将消失,因为您使用rv作为加载视图。