OnGetViewFactory вызывает только один раз для нескольких виджетов

У меня есть appwidget, который использует 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 получает только один раз. Это приводит ко всем виджетам, отображающим одни и те же данные.

Как я могу это исправить?

Ответ 1

Я не тестировал это сам, но, глядя на исходный код для RemoteViewsService.onBind(), я считаю, что вы не можете просто изменять дополнительные функции в своем намерении, чтобы обнаружить, что новый вызов вашего метода onGetViewFactory() поскольку он использует метод Intent.filterEquals() для сравнения:

Определите, совпадают ли два намерения для целей разрешения (фильтрации) намерений. То есть, если их действие, данные, тип, класс и категории одинаковы. Это не сравнивает дополнительные данные, включенные в намерения.

Я бы предложил передать необходимую вам информацию (идентификатор widget?) через данные Intent, возможно, что-то вроде:

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