2013-01-23 21 views
7

私は、ContentProviderのListViewにいくつかのデータを表示するAppWidgetを作成しましたが、更新するのに問題があります。最初にウィジェットを作成すると正しくポピュレートされますが、AlarmManagerのPendingIntentが到着した後、ListViewで更新は行われません。 - 私はLog.d呼び出しからの出力を参照してください - しかしonDataSetChangedへの呼び出し()ではありませんandroid appwidget 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()メソッドが実行されます。ここでは、コードです私のRemoteViewsFactory。 notifyAppWidgetViewDataChangedを呼び出しても、何の効果もありません。

答えて

12

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

を乱数は乱数(あなたWidgetProviderクラスのパブリック静的メンバー)である、あなたのWidgetProviderClass

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

で:私はそれを回避働いどう

。次に、あなたのRemoteViewsFactoryクラスの

は、実行します。

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

それは別のウィジェットのためのファクトリーを作成する必要があり、そのため、更新された値で新工場を作成することを考えるには、この「愚か者」サービスを、これはウィジェットに添付されています。

これが役に立ちます。

+0

ありがとう!これは私のために働いた。 – buntwoi

+0

この手法は機能しますが、メモリプロファイルのウィジェットではメモリ消費量が増えます。私はデバッグ/プロファイリングの目的で1分間隔でアラームを設定しました。 –

+1

この問題は私を壁の上に追いやってしまった。あなたは私の一日を救った。どのようにしてこの解決策に出会ったのですか?ちょっと興味があるんだけど。 Prateekに感謝します。 –

0

でも同じ問題がありました。 ウィジェットのRemoteViewにこの問題があります。

解決方法:自分自身にブロードキャストを送信してリストを再度リフレッシュしてください。つまり、データを完全なビューに設定して、ブロードキャストをyopurselfに送信します。

・ホープこれはあなたのRemoteViewsFactoryは、それが各ウィジェットIDに対して作成するファクトリをキャッシュするためこれは

0

はあなた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()); 
関連する問題