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

nha*_*man 13 android android-appwidget

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

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

在我的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);
}
Run Code Online (Sandbox Code Playgroud)

的构造函数 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);
}
Run Code Online (Sandbox Code Playgroud)

现在问题是,该fillInList方法被调用的方式与小部件的实例一样频繁,但该onGetViewFactory方法只被调用一次.这导致所有小部件显示相同的数据.

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

Joe*_*Joe 31

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

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

我建议通过Intent的数据传递你需要的信息(widget 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);
}
Run Code Online (Sandbox Code Playgroud)

并分别在接收方:

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);
}
Run Code Online (Sandbox Code Playgroud)