RemoteViewFactory onDataSetChanged () вызывается только один раз для notifyAppWidgetViewDataChanged () [duplicate]

1

Я создаю виджет для загрузки списка ингредиентов по рецепту. Моя цель - иметь несколько экземпляров виджета и загружать/обновлять их список ингредиентов (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, тот же результат. Любая помощь или подсказки приветствуются.

Изображение 174551

Теги:
listview
widget
android-widget

1 ответ

0

Нашел ответ здесь @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());

Ещё вопросы

Сообщество Overcoder
Наверх
Меню