onGetViewFactory只为多个小部件调用一次

时间:2012-07-05 18:24:38

标签: android android-appwidget

我有一个使用ListView的appwidget。 我创建了一个扩展RemoteViewsService的类:

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方法只调用一次。这导致所有小部件显示相同的数据。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:30)

我自己没有对此进行测试,但查看RemoteViewsService.onBind()的源代码,我相信你不能只改变你的Intent中的额外内容,以便它能够检测到对{{{{{{需要1}}方法,因为它使用onGetViewFactory()方法进行比较:

  

确定两个意图是否相同以进行意图解析(过滤)。也就是说,如果他们的行为,数据,类型,类别和类别是相同的。这不会比较意图中包含的任何额外数据。

我建议通过Intent的数据传递你需要的信息(widget id?),可能是这样的:

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

答案 1 :(得分:-1)

根据上面的描述,如果您要设置除字符串之外的其他意图,则可以执行以下另一种技巧:

Random random = new Random();
intent.setType(String.valueOf(random.nextInt(1000)));

这将调用对onGetViewFactory();