2013-01-23 12 views
7

Ho scritto un AppWidget che visualizza alcuni dati in un ListView da un ContentProvider, ma ho problemi ad aggiornarlo. Quando creo per la prima volta il widget, viene popolato correttamente, ma dopo l'arrivo di PendingIntent di AlarmManager, non si verifica alcun aggiornamento sul ListView. Ecco il codice:android listwidget listview non si aggiorna

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); 

cosa strana è, quando l'aggiornamento avviene, il metodo onUpdate() corre - Vedo l'uscita dalla chiamata Log.d - ma non c'è nessuna chiamata a onDataSetChanged() in my RemoteViewsFactory. Anche quando chiamo notifyAppWidgetViewDataChanged, nessun effetto.

risposta

12

Questo perché il RemoteViewsFactory memorizza nella cache la fabbrica si crea per ciascun widget ID. Quindi quando lo stesso widget invia una richiesta per creare un nuovo factory (tramite il servizio Widget Adapter), viene restituito lo stesso factory. Quindi, la visualizzazione elenco non è "aggiornata".

Come ho lavorato intorno ad esso:

Nella tua WidgetProviderClass

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

dove RandomNumber è un numero casuale (un membro pubblico statico della classe WidgetProvider).

Poi nella classe RemoteViewsFactory, do:

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

Questa "pazzi", il servizio a pensare che si deve creare una fabbrica per un altro widget, e quindi, crea una nuova fabbrica con i valori aggiornati, che è collegato al tuo widget.

Spero che questo aiuti.

+0

Grazie! Questo ha funzionato per me. – buntwoi

+0

Questa tecnica funziona ma, con il profilo di memoria del widget, il consumo di memoria aumenta. Ho impostato un allarme su intervalli di un minuto per scopi di debug/profiling. –

+1

Questo problema mi aveva spinto al muro. Mi hai salvato la giornata. Come hai trovato questa soluzione? solo curioso. Grazie, Prateek. –

0

Anche io ho avuto lo stesso problema. RemoteView del widget presenta questo problema.

Soluzione: Inviare la trasmissione a se stessi e aggiornare nuovamente la lista. Impostare i dati sulla vista completa e quindi inviare la trasmissione a se stessi.

Spero che questo aiuti

0

Prova numero dinamica

Nei tuoi 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); 

E nella classe RemoteViewsFactory, do:

AppWidgetId = Integer.valueOf(intent.getData().getSchemeSpecificPart()); 
Problemi correlati