2012-07-05 40 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

相关问题