2012-07-05 20 views
11

ListView'u kullanan bir appwidget sahibim. Ben genişleten bir sınıf oluşturduk RemoteViewsService:onGetViewFactory sadece birden fazla widget için bir kez çağrıldı

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

benim AppWidgetProvider, ben (her appWidgetId için) widget her örneği için aşağıdaki yöntemini çağırır: AppWidgetListFactory ait

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

yapıcı

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

Şimdi sorun şu ki, bu fillInList yöntemi, widget'ın örnekleri olduğu kadar sık ​​çağrılır, ancak onGetViewFactory yöntemi yalnızca bir kez çağrılır. Bu, aynı verileri gösteren tüm widget'larla sonuçlanır.

Bunu nasıl düzeltebilirim?

+0

: Alıcı tarafında

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

ve sırasıyla Biraz daha kod ekleyebilir misin? "fillInList" yöntemini statik yapmazsanız çalışır mı? – Ronnie

+0

Benim durumumda intent.putExtra işe yarıyor. Her bir örnek doğru gerekli widget id almak. –

cevap

24

Bunu kendim test etmedim, ancak RemoteViewsService.onBind() için kaynak koduna baktığımda, onGetViewFactory() yöntemine yeni bir çağrının gerekli olduğunu algılayabilmesi için yalnızca Intent'teki ekstraları değiştiremeyeceğinizi düşünüyorum. iki niyet niyet çözünürlük (filtreleme) amaçları için aynı ise

belirlemek: karşılaştırma için Intent.filterEquals() yöntemini kullanır. Yani, eylemleri, verileri, türü, sınıfı ve kategorileri aynıysa. Bu, niyetlere dahil edilen herhangi bir fazla veriyi karşılaştırmamaktadır.

belki bir şey gibi yerine amaçlamaktayız verileri üzerinden ihtiyacınız olan bilgileri (widget kimliği?) Geçen öneririm

:

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

Bu gerçekten hile yaptı, çok teşekkürler! – nhaarman

+0

@Joe bunu kodumda nasıl yapacağımı kontrol edebilir, aslında söylediğim gibi değişiklikler yaptım ama şimdi çöküyor. Bu benim http://pastie.org/7063960 kodum ve bu logcat http://pastie.org/7063968 – AndroidDev

+0

@Anshuman İlk pastie'mizde 36 numaralı satırda bir sorun görüyorum: 'String.valueOf (appWidgetIds)' . Burada "appWidgetIds" tek bir tamsayı yerine bir dizidir ve amaçta geçersiz bir URI üretir ("2" yerine "[I @ 424b7d58" gibi bir şey). Bunun yerine 'String.valueOf (appWidgetIds [0])' yazmayı mı kastediyorsunuz? – Joe

İlgili konular