14

我有一个使用ListView. 我创建了一个扩展类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方法只被调用一次。这会导致所有小部件显示相同的数据。

我怎样才能解决这个问题?

4

2 回答 2

34

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

出于意图解析(过滤)的目的,确定两个意图是否相同。也就是说,如果它们的动作、数据、类型、类和类别相同。这不会比较意图中包含的任何额外数据。

我建议通过 Intent 的数据传递您需要的信息(小部件 ID?),可能类似于:

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);
}
于 2012-07-08T22:34:34.933 回答
2

根据上面的描述,如果您设置的意图不是字符串,您可以做的另一个技巧是:

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

这将调用 onGetViewFactory();

于 2018-07-15T20:29:26.253 回答