Quantcast
Channel: Active questions tagged listview - Stack Overflow
Viewing all articles
Browse latest Browse all 790

notifyappwidgetviewdatachanged not working on a listview on my widget

$
0
0

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.        //[...]    }}

Viewing all articles
Browse latest Browse all 790

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>