2012-07-05 17 views
11

Tengo un appwidget que usa ListView. He creado una clase que se extiende RemoteViewsService:onGetViewFactory solo llamado una vez para varios widgets

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

En mi AppWidgetProvider, que invoca el método siguiente para cada instancia del widget (para cada 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); 
} 

El constructor de la 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); 
} 

Ahora el problema es que elEl método 210 se llama con la misma frecuencia que hay instancias del widget, pero el método onGetViewFactory solo se llama una vez. Esto da como resultado que todos los widgets muestren los mismos datos.

¿Cómo puedo solucionar esto?

+0

podrías agregar un poco más de código? ¿Funciona si haces que el método 'fillInList' no sea estático? – Ronnie

+0

En mi caso intent.putExtra funciona. Cada instancia obtengo el id. De widget necesario correcto. –

Respuesta

24

No he probado esto por mí mismo, pero mirando el código fuente RemoteViewsService.onBind(), creo que no puede simplemente variar los extras en su Intento para que detecte que se necesita una nueva llamada a su método onGetViewFactory() desde que utiliza el método Intent.filterEquals() para la comparación:

determinar si dos intentos son los mismos para los efectos de la resolución intención (filtrado). Es decir, si su acción, datos, tipo, clase y categorías son los mismos. Esto no compara ningún dato adicional incluido en los intentos.

Yo sugeriría que pasa la información que necesita (Identificación del Reproductor?) A través de los datos de la intención en su lugar, tal vez algo como:

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

y respectivamente en el lado receptor:

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

Eso sí funcionó, ¡muchas gracias! – nhaarman

+0

@Joe puedes ver cómo hacer esto en mi código, en realidad hice los cambios como dijiste, pero ahora falla. Este es mi código http://pastie.org/7063960 y este es el logcat http://pastie.org/7063968 – AndroidDev

+0

@Anshuman Veo un problema en la línea 36 en tu primer pastie: 'String.valueOf (appWidgetIds)' . Aquí 'appWidgetIds' es una matriz en lugar de un único entero y produce un URI no válido en el intento (algo así como" [I @ 424b7d58 "en lugar de" 2 "). ¿Pretende escribir 'String.valueOf (appWidgetIds [0])' en su lugar? – Joe

Cuestiones relacionadas