Я создаю виджет для загрузки списка ингредиентов по рецепту. Моя цель - иметь несколько экземпляров виджета и загружать/обновлять их список ингредиентов (ListView) независимо. Я настроил настройку для пользователя, чтобы выбрать рецепт. После настройки и заполнения RemoteViews и внесения RemoteAdapter для моего списка ингредиентов метод всегда вызывал:
appWidgetManager.updateAppWidget(mAppWidgetId, views);
appWidgetManager.notifyAppWidgetViewDataChanged(mAppWidgetId, R.id.widget_list_view_layout);
updateAppWidget прекрасно обновляет представления, отличные от коллекции, однако у меня есть говядина с notifyAppWidgetViewDataChanged() для моего вида коллекции, списка ингредиентов.
В первый раз, когда я добавляю виджет на экран (recipeId 4), он загружается правильно и вызывает правильный сервис и просмотр factory, чтобы заполнить удаленный listView. Но если я добавлю второй, вот что происходит (или его отсутствие):
D/WidgetUtils: createAppWidgetResult() with appWidgetId: 78, recipeId: 4
D/WidgetUtils: RecipeId of the ingredients passed: 4
D/WidgetRemoteViewService: onGetViewFactory() call received with mRecipeId 4
D/WidgetRemoteViewsFactory: WidgetRemoteViewsFactory() constructed with recipeId: 4
D/WidgetRemoteViewsFactory: onDataSetChanged() called
D/WidgetUtils: createAppWidgetResult() with appWidgetId: 79, recipeId: 1
D/WidgetUtils: RecipeId of the ingredients passed: 1
D/WidgetUtils: createAppWidgetResult() with appWidgetId: 80, recipeId: 2
D/WidgetUtils: RecipeId of the ingredients passed: 2
Конец журнала
Я ожидал следующее: если идентификатор рецепта 1
D/WidgetRemoteViewService: onGetViewFactory() call received with mRecipeId **1**
D/WidgetRemoteViewsFactory: WidgetRemoteViewsFactory() constructed with recipeId: **1**
D/WidgetRemoteViewsFactory: onDataSetChanged() called
Но, как видно из приведенного выше журнала, ничего не происходит после 1 (в отличие от 4, которое является ожидаемым поведением)
UI мудрый, в любом последующем созданном списке виджетов на самом деле есть ингредиенты для рецепта 4 (не 1), даже если активность конфигурации явно пропускает идентификатор как 1... 2... 6..etc.
Странно достаточно: Только после того, как я удалю все мои виджеты с главного экрана, а затем добавлю виджет ОДНОГО, например, рецепт id 1, его onDataSetChanged() будет вызываться?! и снова, любой последующий виджет не будет вызываться.
См. скриншот. Идентификатор рецепта пирога Nutella равен 4, а идентификатор рецепта Brownies - 1. Сначала добавляется виджет Nutella Pie, ингредиенты для Nutella Pie правильно загружены. "Брауни" добавляется второй, и, как вы можете видеть, ингредиенты переносятся с первого, и они неправильны.
Попытались выяснить последние 2 дня, спасибо заранее. Протестировано на эмуляторе и реальных устройствах > API 21, тот же результат. Любая помощь или подсказки приветствуются.
Нашел ответ здесь @Joe onGetViewFactory только один раз для нескольких виджетов
Как оказалось, это что-то о том, как обрабатывать RemoteViewService. Я создавал намерение RemoteViewService, как обычно 99.999% в любой деятельности, например:
// Create intent to start the service and to act as the remote listView adapter
Intent remoteViewIntent = new Intent(context, WidgetRemoteViewService.class);
remoteViewIntent.putExtra(EXTRA_RECIPE_ID, recipeId);
views.setRemoteAdapter(R.id.widget_recipe_ingredients_list, remoteViewIntent);
Решение: вместо
remoteViewIntent.putExtra(EXTRA_RECIPE_ID, recipeId);
Измените его на:
remoteViewIntent.setData(Uri.fromParts("content", String.valueOf(recipeId), null));
и в RemoteViewsService onGetViewFactory(), получите данные от намерения так:
long mRecipeId = Long.valueOf(intent.getData().getSchemeSpecificPart());