7

ContentProvider から ListView にデータを表示する AppWidget を作成しましたが、更新に問題があります。最初にウィジェットを作成すると、ウィジェットは正しく設定されますが、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, 0, 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 を呼び出しても効果はありません。

4

3 に答える 3

15

これは、RemoteViewsFactory がウィジェット ID ごとに作成するファクトリをキャッシュするためです。したがって、同じウィジェットが (ウィジェット アダプター サービスを介して) 新しいファクトリを作成する要求を送信すると、同じファクトリが返されます。したがって、リスト ビューは「更新」されません。

私がそれをどのように回避したか:

WidgetProviderClass で

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

ここで、randomNumber は乱数です (WidgetProvider クラスの public Static メンバー)。

次に、RemoteViewsFactory クラスで次のようにします。

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

これにより、Service は別のウィジェット用に Factory を作成する必要があると「だまされ」、更新された値で新しい Factory が作成され、ウィジェットにアタッチされます。

お役に立てれば。

于 2013-06-24T07:13:57.130 に答える
1

動的数を試す

WidgetProviderClass で:

int randomNumber=(int)(Math.random()*1000); 
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId+randomNumber);

           intent.setData(Uri.fromParts("content", String.valueOf(appWidgetId), null));

           intent.putExtra("random",randomNumber );
           intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME)));
           rv = new RemoteViews(context.getPackageName(), R.layout.widget_layout);

そして、RemoteViewsFactory クラスで、次のようにします。

AppWidgetId = Integer.valueOf(intent.getData().getSchemeSpecificPart());
于 2016-11-15T16:48:48.443 に答える