I tried lots of solutions but after weeks i have not been able to solve this issue: why "notifyappwidgetviewdatachanged" doesn't work? how can i update a listview placed on my widget? Where am i wrong?
Here are my classes.
Widget Provider:
public class Widget_Provider extends AppWidgetProvider{public static final String ACTION_MOSTRAORARI = "fACTION_TOAST";public static final String EXTRA_STRING = "EXTRA_STRING";@Overridepublic void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { // There may be multiple widgets active, so update all of them for (int appWidgetId : appWidgetIds) { RemoteViews views = updateWidgetListView(context, appWidgetId); final Intent onItemClick = new Intent(context, Widget_Provider.class); onItemClick.setAction(ACTION_MOSTRAORARI); onItemClick.setData(Uri.parse(onItemClick.toUri(Intent.URI_INTENT_SCHEME))); final PendingIntent onClickPendingIntent = PendingIntent.getBroadcast(context, 0, onItemClick, PendingIntent.FLAG_UPDATE_CURRENT); views.setPendingIntentTemplate(R.id.myStopList, onClickPendingIntent); appWidgetManager.updateAppWidget(appWidgetId, views); } super.onUpdate(context, appWidgetManager, appWidgetIds);}public RemoteViews updateWidgetListView(Context context, int appWidgetId){ RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget); Intent svcIntent = new Intent(context, Widget_Service.class); svcIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); svcIntent.setData(Uri.parse(svcIntent.toUri(Intent.URI_INTENT_SCHEME))); remoteViews.setRemoteAdapter(R.id.myStopList, svcIntent); return remoteViews;}@Overridepublic void onReceive(Context context, Intent intent){ if (intent.getAction().equals(ACTION_MOSTRAORARI)) { if (MainUtils.isNewtworkAvailable(context)) { String item = intent.getExtras().getString(EXTRA_STRING); Intent intentOrari = new Intent(context, Diag_MostraOrari.class); intentOrari.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); context.startActivity(intentOrari); } } super.onReceive(context, intent);}@Overridepublic void onDeleted(Context context, int[] appWidgetIds) {}@Overridepublic void onEnabled(Context context) {}@Overridepublic void onDisabled(Context context) {}}Widget Service:
public class Widget_Service extends RemoteViewsService{@Overridepublic RemoteViewsFactory onGetViewFactory(Intent intent){ Map<String, ArrayList<String>> map = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); /* --- * Here i fetch data from a local db and store it on "map" */ --- return (new Widget_ListProvider(this.getApplicationContext(), intent, map));}}ListProvider:
public class Widget_ListProvider implements RemoteViewsFactory{private Map<String, ArrayList<String>> map = new HashMap<>();private ArrayList<ListItem_Widget> listItemList = new ArrayList<>();private Context context = null;private int appWidgetId;public Widget_ListProvider(Context context, Intent intent, Map<String, ArrayList<String>> map) { this.map = map; this.context = context; appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); populateListItem();}//This function populate the arraylist "listItemList" by the data stored on "map"private void populateListItem() { [...] }@Overridepublic int getCount() { return listItemList.size();}@Overridepublic long getItemId(int position) { return position;}@Overridepublic RemoteViews getViewAt(int position){ final RemoteViews remoteView = new RemoteViews(context.getPackageName(), R.layout.listitem_widget); ListItem_Widget listItem = listItemList.get(position); remoteView.setTextViewText(R.id.heading, listItem.heading); remoteView.setTextViewText(R.id.content, listItem.content); final Intent fillInIntent = new Intent(); fillInIntent.setAction(Widget.ACTION_MOSTRAORARI); final Bundle bundle = new Bundle(); bundle.putString(Widget.EXTRA_STRING, listItem.heading); fillInIntent.putExtras(bundle); remoteView.setOnClickFillInIntent(R.id.listrow, fillInIntent); return remoteView;}@Overridepublic RemoteViews getLoadingView() { return null;}@Overridepublic int getViewTypeCount() { return 1;}@Overridepublic boolean hasStableIds() { return true;}@Overridepublic void onCreate() {}@Overridepublic void onDataSetChanged() {}@Overridepublic void onDestroy() {}}The xml of my listview custom item contains just two textviews: "heading" and "content".
Where am i wrong? why when i call "notifyappwidgetviewdatachanged" from another activity nothing happens?
[EDIT]
That's the activity where i need to update my widget.
public class Diag_Line extends AppCompatActivity { //[...] @Override protected void onCreate(Bundle savedInstanceState) { //[...] AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(getApplicationContext()); ComponentName thisAppWidget = new ComponentName(getApplicationContext().getPackageName(), Widget.class.getName()); int[] appWidgetIds = appWidgetManager.getAppWidgetIds(thisAppWidget); appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetIds, R.id.myStopList); //"myStopList" is the id of my listview inside the widget xml. //[...] }}