2017-09-25 5 views
1

Je construis un widget pour charger une liste d'ingrédients par recette. Mon but est de pouvoir avoir plusieurs instances du widget et avoir leur liste d'ingrédients (ListView) chargée/mise à jour indépendamment. J'ai configuré une activité de configuration pour que l'utilisateur sélectionne la recette. Une fois la configuration et peuplant les remoteViews et de faire la RemoteAdapter pour ma liste des ingrédients, la méthode serait toujours appeler:RemoteViewFactory onDataSetChanged() seulement appelé une fois par notifyAppWidgetViewDataChanged()

appWidgetManager.updateAppWidget(mAppWidgetId, views); 
appWidgetManager.notifyAppWidgetViewDataChanged(mAppWidgetId, R.id.widget_list_view_layout); 

updateAppWidget met à jour les vues non-collecte bien, cependant, je vais avoir un boeuf avec notifyAppWidgetViewDataChanged() pour ma vue de collection, la liste des ingrédients.

La première fois que j'ajoute le widget à l'écran (recipeId 4), il se charge correctement et appelle le service correct et affiche la fabrique pour remplir la liste de contrôle distante. Mais si j'ajoute le second, voici ce qui se passe (ou l'absence de celui-ci):

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 

Fin du journal

Je me attendais à ce qui suit, si l'identifiant de recette est

D/WidgetRemoteViewService: onGetViewFactory() call received with mRecipeId **1** 
D/WidgetRemoteViewsFactory: WidgetRemoteViewsFactory() constructed with recipeId: **1** 
D/WidgetRemoteViewsFactory: onDataSetChanged() called 

Mais comme vous pouvez le voir ci-dessus Log, rien ne se passe après 1 (contrairement à 4 qui est le comportement attendu)

UI sage, tout subsequentl La liste listée de widget créée a en réalité les ingrédients pour la recette 4 (pas 1), même lorsque l'activité de configuration passe clairement l'identifiant comme 1 ... 2 ... 6..etc.

Étrangement:?! seulement après je supprimer tous mes widgets de l'écran d'accueil, puis ajouter un widget par exemple id recette 1, sa onDataSetChanged() serait appelé, et encore, les années widget suivantes ne sera pas appelé.

Voir la capture d'écran L'ID de la recette du Nutella Pie est 4, et l'identifiant de la recette est Brownies 1. Le widget Pie nutella est ajouté d'abord, les ingrédients de la tarte Nutella est correctement chargé. Les Brownies sont ajoutés en second lieu, et comme vous pouvez le voir, les ingrédients sont reportés du premier, et ils sont incorrects.

J'essayais de comprendre pour les 2 derniers jours, merci d'avance. Testé sur émulateur et périphériques réels> API 21, même résultat. Toute aide ou des conseils sont appréciés.

enter image description here

Répondre

0

trouvé la réponse ici par @ Joe onGetViewFactory only called once for multiple widgets

Comme il se trouve, il est quelque chose sur la façon dont la manipulation intention RemoteViewService. Je créais l'intention RemoteViewService comme ce que je 99.999% ne normalement dans toute activité, ex:

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

Solution: Au lieu de

remoteViewIntent.putExtra(EXTRA_RECIPE_ID, recipeId); 

Modifier à:

remoteViewIntent.setData(Uri.fromParts("content", String.valueOf(recipeId), null)); 

et onGetViewFactory() du RemoteViewsService, obtenir les données de l'intention comme suit:

long mRecipeId = Long.valueOf(intent.getData().getSchemeSpecificPart());