2012-07-05 21 views
11

Ho un appwidget che utilizza ListView. Ho creato una classe che estende RemoteViewsService:onGetViewFactory chiamato solo una volta per più widget

public class AppWidgetService extends RemoteViewsService { 
    @Override 
    public RemoteViewsFactory onGetViewFactory(Intent intent) { 
     return (new AppWidgetListFactory(this.getApplicationContext(), intent)); 
    } 
} 

Nel mio AppWidgetProvider, ho chiamare il seguente metodo per ogni istanza del widget (per ogni appWidgetId):

private static void fillInList(RemoteViews widget, Context context, int appWidgetId) { 
    Intent intent = new Intent(context, AppWidgetService.class); 
    intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); 
    widget.setRemoteAdapter(R.id.appwidget_listview, intent); 
} 

Il costruttore del AppWidgetListFactory

public AppWidgetListFactory(Context context, Intent intent) { 
    this.context = context; 
    appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); 

    System.out.println("New TVAPWLF for: " + appWidgetId); 
    trains = WidgetData.getInstance().widgetMap.get(appWidgetId); 
} 

Ora il problema è che ilIl metodo 210 viene chiamato tutte le volte che ci sono istanze del widget, ma il metodo onGetViewFactory viene chiamato una sola volta. Ciò si traduce in tutti i widget che mostrano gli stessi dati.

Come posso risolvere questo problema?

+0

potresti aggiungere altro codice? funziona se si rende il metodo 'fillInList' non statico? – Ronnie

+0

Nel mio caso intent.putExtra funziona. Ogni istanza ottengo l'ID del widget necessario corretto. –

risposta

24

Non l'ho ancora provato, ma guardando il codice sorgente per RemoteViewsService.onBind(), credo che non si possano semplicemente modificare gli extra nell'intento in modo che esso rilevi che è necessaria una nuova chiamata al tuo metodo onGetViewFactory() dal si utilizza il metodo Intent.filterEquals() per il confronto:

determinare se due intenti sono uguali ai fini della risoluzione intenti (filtraggio). Cioè, se la loro azione, i dati, il tipo, la classe e le categorie sono gli stessi. Questo non confronta alcun dato extra incluso negli intenti.

Vorrei suggerire che passa le informazioni di cui avete bisogno (widget di id?) Attraverso i dati del Intent, invece, forse qualcosa di simile:

private static void fillInList(RemoteViews widget, Context context, int appWidgetId) { 
    Intent intent = new Intent(context, AppWidgetService.class); 
    intent.setData(Uri.fromParts("content", String.valueOf(appWidgetId), null)); 
    widget.setRemoteAdapter(R.id.appwidget_listview, intent); 
} 

e, rispettivamente, sul lato ricevente:

public TreinVerkeerAppWidgetListFactory(Context context, Intent intent) { 
    this.context = context; 
    appWidgetId = Integer.valueOf(intent.getData().getSchemeSpecificPart()); 

    System.out.println("New TVAPWLF for: " + appWidgetId); 
    trains = WidgetData.getInstance().widgetMap.get(appWidgetId); 
} 
+1

Questo ha davvero funzionato, grazie mille! – nhaarman

+0

@Joe puoi controllare come farlo nel mio codice, in realtà ho apportato le modifiche come hai detto ma ora si blocca. Questo è il mio codice http://pastie.org/7063960 e questo è il logcat http://pastie.org/7063968 – AndroidDev

+0

@Anshuman Vedo un problema alla riga 36 del primo pastoe: 'String.valueOf (appWidgetIds)' . Qui 'appWidgetIds' è una matrice invece di un singolo intero e produce un URI non valido nell'intento (qualcosa come" [I @ 424b7d58 "invece di" 2 "). Intendi scrivere 'String.valueOf (appWidgetIds [0])'? – Joe

Problemi correlati