2012-07-05 36 views
11

我有一個使用ListView的appwidget。 我已經創建了一個延伸的類RemoteViewsServiceonGetViewFactory只針對多個窗口小部件調用過一次

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

在我AppWidgetProvider,我呼籲小部件的每個實例(每個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); 
} 

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

現在問題是,那fillInList方法被調用的次數與小部件的實例一樣多,但onGetViewFactory方法只被調用一次。這會導致所有小部件顯示相同的數據。

我該如何解決這個問題?

+0

你能添加更多的代碼嗎?如果你使'fillInList'方法不是靜態的,它會起作用嗎? – Ronnie 2012-07-08 16:32:52

+0

在我的情況下intent.putExtra確實有效。每個實例我都會得到正確的必需的小部件ID。 – 2017-03-09 11:31:08

回答

24

我沒有這個測試自己,但看着爲RemoteViewsService.onBind()的源代碼,我相信你不能改變你的意圖的演員,以便它檢測到,因爲需要你onGetViewFactory()方法一個新的呼叫它使用Intent.filterEquals()方法進行比較:

確定兩個意圖是否相同意圖解決(過濾)的目的。也就是說,如果他們的行爲,數據,類型,類別和類別相同。這並不比較意圖中包含的任何額外數據。

我會建議通過意向的數據,你需要的信息(部件編號?)不是,也許是這樣的:

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

,並分別在接收端:

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

確實有這個技巧,非常感謝! – nhaarman 2012-07-08 23:29:33

+0

@Joe你可以在我的代碼中檢查如何做到這一點,實際上我按照你所說的做了修改,但現在它崩潰了。這是我的代碼http://pastie.org/7063960,這是logcat http://pastie.org/7063968 – AndroidDev 2013-03-22 08:19:15

+0

@Anshuman我看到你的第一個pastie行36上的問題:'String.valueOf(appWidgetIds)' 。這裏'appWidgetIds'是一個數組而不是一個整數,它在意圖中產生一個無效的URI(類似於「[I @ 424b7d58」而不是「2」)。你打算寫'String.valueOf(appWidgetIds [0])'而不是? – Joe 2013-03-22 16:21:39

相關問題