如果只有1个项目,则在主页小部件列表视图中闪烁问题

时间:2014-04-03 18:47:44

标签: android android-listview android-widget

我意识到,如果主页小部件列表视图中只有1个项目,则会出现闪烁问题,如果我们执行

appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetId, android.R.id.list_view);

请注意,如果主页小部件列表视图中有2个或更多项目,问题就会消失?!

注意,我已将小部件的大小调整为4x4。 (尺寸无关紧要。即使我使用4x2也能观察到闪烁)

我使用 WeatherListWidget 作为示例

https://android.googlesource.com/platform/development/+/master/samples/WeatherListWidget/src/com/example/android/weatherlistwidget/WeatherDataProvider.java

如果我们要改变

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个列表视图项才会出现问题?有没有解决方法来解决这个问题?

3 个答案:

答案 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作为加载视图。