I have an appwidget which uses ListView.
I have created a class that extends RemoteViewsService:
public class AppWidgetService extends RemoteViewsService {
@Override
public RemoteViewsFactory onGetViewFactory(Intent intent) {
return (new AppWidgetListFactory(this.getApplicationContext(), intent));
}
}
In my AppWidgetProvider, I call the following method for each instance of the widget (for each 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);
}
The constructor of the 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);
}
Now the problem is, that the fillInList method gets called just as often as there are instances of the widget, but the onGetViewFactory method only gets called once. This results in all the widgets showing the same data.
How can I fix this?
I haven’t tested this myself, but looking at the source code for
RemoteViewsService.onBind(), I believe you can not just vary the extras in your Intent in order for it to detect that a new call to youronGetViewFactory()method is needed since it uses theIntent.filterEquals()method for the comparison:I would suggest passing the information that you need (widget id?) through the Intent’s data instead, maybe something like:
and respectively on the receiving side: