android appwidget listview没有更新

前端之家收集整理的这篇文章主要介绍了android appwidget listview没有更新前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我编写了一个AppWidget,它从ContentProvider中显示ListView中的一些数据,但是我无法更新它.当我第一次创建窗口小部件时,它会正确填充,但在AlarmManager的PendingIntent到达后,ListView上不会发生更新.这是代码
Intent update = new Intent(context,MenuWidgetProvider.class);
update.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
update.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS,appWidgetIds);
PendingIntent pIUpdate = PendingIntent.getBroadcast(context,update,0);
((AlarmManager) context.getSystemService(Context.ALARM_SERVICE)).
set(AlarmManager.RTC,nextTime.toMillis(false),pIUpdate);

Log.d(TAG,"updating: " + dmt.mealName);

for (int i = 0; i < appWidgetIds.length; ++i) {
    int widgetId = appWidgetIds[i];

    RemoteViews views = new RemoteViews(context.getPackageName(),R.layout.widget_menu);
    // meal name
    views.setTextViewText(R.id.widget_locname,prefs.getString(PREF_WIDGET_LOCNAME,""));

    // adapter
    Intent adapter = new Intent(context,MenuWidgetAdapterService.class);
    adapter.putExtra(EXTRA_LOCATIONID,prefs.getInt(PREF_WIDGET_LOCID,-1));
    adapter.putExtra(EXTRA_MEALNAME,dmt.mealName);
    adapter.putExtra(EXTRA_DATE,dmt.date.toString());
    views.setRemoteAdapter(R.id.widget_list,adapter);

    // update
    manager.updateAppWidget(widgetId,views);
}

super.onUpdate(context,manager,appWidgetIds);

奇怪的是,当更新发生时,onUpdate()方法运行 – 我看到Log.d调用输出 – 但我的RemoteViewsFactory中没有调用onDataSetChanged().即使我调用notifyAppWidgetViewDataChanged,也没有效果.

解决方法

这是因为您的RemoteViewsFactory缓存了为每个窗口小部件ID创建的工厂.因此,当相同的小部件发送创建新工厂的请求(通过Widget适配器服务)时,将返回相同的工厂.因此,列表视图不是“更新的”.

我是如何解决它的:

在你的WidgetProviderClass中

adapter.setData(Uri.fromParts("content",String.valueOf(appWidgetIds[i]+randomNumber),null));

randomNumber是一个随机数(WidgetProvider类的公共静态成员).

然后在RemoteViewsFactory类中,执行:

appWidgetId = Integer.valueOf(intent.getData().getSchemeSpecificPart())
            - WidgetProvider.randomNumber;

这让“服务”认为它必须为另一个小部件创建一个Factory,因此创建一个带有更新值的新工厂,该工厂附加到您的小部件.

希望这可以帮助.

猜你在找的Android相关文章