【问题标题】:Android appwidget remoteviews not updatingAndroid appwidget remoteviews没有更新
【发布时间】:2013-08-09 19:20:25
【问题描述】:

当我从某个活动更新小部件时,列表远程视图没有更新(我的意思是刷新自身)。它出现在应用小部件的 onUpdate (显示日志)。但不会进入列表视图的适配器以使用新数据对其进行膨胀。

public void onUpdate(Context context, AppWidgetManager appWidgetManager,

int[] appWidgetIds) {
    final int N = appWidgetIds.length;
    for (int i = 0; i < N; i++) {
        int appWidgetId = appWidgetIds[i];

        Log.e("called", "onupdate");

        RemoteViews views = new RemoteViews(context.getPackageName(),
                R.layout.widget_lay);

        views.setTextViewText(R.id.textView1,
                "Floating Text will be displayed here .. Daily Thoughts");

        Intent intent = new Intent(context, RemoteServiceEmin.class);
        intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
        views.setRemoteAdapter(R.id.gridview, intent);

        // inflating list remote view

        Intent intentlist = new Intent(context, ListInflater.class);
        intentlist.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,
                appWidgetId);
        intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME)));
        views.setRemoteAdapter(R.id.listview, intentlist);

        // setting onclick on gridview
        Intent itemClickIntent = new Intent(context, MyWidgetProvider.class);
        itemClickIntent.setAction(ITEM_CLICK_ACTION);
        itemClickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,
                appWidgetIds[i]);
        PendingIntent itemClickPendingIntent = PendingIntent.getBroadcast(
                context, 0, itemClickIntent,
                PendingIntent.FLAG_UPDATE_CURRENT);
        views.setPendingIntentTemplate(R.id.gridview,
                itemClickPendingIntent);

        appWidgetManager.updateAppWidget(appWidgetId, views);
    }
    super.onUpdate(context, appWidgetManager, appWidgetIds);

}

【问题讨论】:

    标签: android android-appwidget appwidgetprovider


    【解决方案1】:

    所以终于完成了,再次感谢 developer.android.com 。您需要做的就是,从您要处理“更新”的位置触发广播意图。

    Intent initialUpdateIntent = new Intent(
                    AppWidgetManager.ACTION_APPWIDGET_UPDATE);
            initialUpdateIntent
                    .setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
            sendBroadcast(initialUpdateIntent);
    

    然后在 Appwidget 的 onRecieve 中捕获它,并使用

    更新 Remoteview
     notifyAppWidgetViewDataChanged(). 
    

    类似于coden-pbelow

     else if (intent.getAction().equals(
                AppWidgetManager.ACTION_APPWIDGET_UPDATE)) {
    
             AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
    
                ComponentName thisAppWidget = new ComponentName(context.getPackageName(), MyWidgetProvider.class.getName());
                int[] appWidgetIds = appWidgetManager.getAppWidgetIds(thisAppWidget);
                 appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetIds,  R.id.listviewnew);
               Log.e("finally after a whole day", "working :");  
    
        }
    

    【讨论】:

    • 此方法不稳定: 1. AppWidgetProvider接收广播大约需要4秒; 2. 有时,AppWidgetProvider 根本无法接收到广播。请使用stackoverflow.com/a/7738687/903665中的方法
    • 除此方案外,我在 onDataSetChanged 方法中重复了 onCreate 方法的功能,创建了另一个方法来加载数据并由两个方法共享。
    猜你喜欢
    • 1970-01-01
    • 2011-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多