2013-01-23 112 views
7

我已經編寫了一個AppWidget,它顯示ContentProvider在ListView中的一些數據,但是我無法更新它。當我第一次創建小部件時,它會正確填充,但是在AlarmManager的PendingIntent到達後,ListView上不會發生更新。下面的代碼:android appwidget listview不更新

Intent update = new Intent(context, MenuWidgetProvider.class); 
update.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE); 
update.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds); 
PendingIntent pIUpdate = PendingIntent.getBroadcast(context, 0, update, 0); 
((AlarmManager) context.getSystemService(Context.ALARM_SERVICE)). 
set(AlarmManager.RTC, nextTime.toMillis(false), pIUpdate); 

Log.d(TAG, "updating: " + dmt.mealName); 

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

    RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_menu); 
    // meal name 
    views.setTextViewText(R.id.widget_locname, prefs.getString(PREF_WIDGET_LOCNAME, "")); 

    // adapter 
    Intent adapter = new Intent(context, MenuWidgetAdapterService.class); 
    adapter.putExtra(EXTRA_LOCATIONID, prefs.getInt(PREF_WIDGET_LOCID, -1)); 
    adapter.putExtra(EXTRA_MEALNAME, dmt.mealName); 
    adapter.putExtra(EXTRA_DATE, dmt.date.toString()); 
    views.setRemoteAdapter(R.id.widget_list, adapter); 

    // update 
    manager.updateAppWidget(widgetId, views); 
} 

super.onUpdate(context, manager, appWidgetIds); 

奇怪的是,當更新發生時,的onUpdate()方法運行 - 我看到從Log.d調用的輸出 - 但目前還沒有onDataSetChanged()的調用中我的RemoteViewsFactory。即使我調用notifyAppWidgetViewDataChanged,也沒有任何效果。

回答

12

這是因爲你的RemoteViewsFactory緩存它會爲每個插件ID工廠。因此,當相同的小部件發送創建新工廠的請求(通過Widget Adapter Service)時,將返回相同的工廠。因此,列表視圖不是「更新」的。

如何我工作圍繞它:

在你WidgetProviderClass

adapter.setData(Uri.fromParts("content", String.valueOf(appWidgetIds[i]+randomNumber), null)); 

其中randomNumber是一個隨機數(您WidgetProvider類的公共靜態成員)。

然後在您的RemoteViewsFactory類,這樣做:

appWidgetId = Integer.valueOf(intent.getData().getSchemeSpecificPart()) 
      - WidgetProvider.randomNumber; 

這種「傻瓜」的服務,以爲它創建一個工廠的另一個部件,因此,用更新的值創建一個新的工廠,附加到您的小部件。

希望這會有所幫助。

+0

謝謝!這對我有效。 – buntwoi

+0

這種技術可以工作,但隨着我的內存配置文件的部件,內存消耗增長。爲了調試/分析目的,我每隔一分鐘設置一次警報。 –

+1

這個問題讓我受不了。你拯救了我的一天。你是如何遇到這個解決方案的?只是好奇。謝謝Prateek。 –

0

即使我有同樣的問題。 widget的RemoteView有這個問題。

解決方案:向自己發送廣播並再次刷新列表。即將數據設置爲您的完整視圖,然後將廣播發送給yopurself。

希望這有助於

0

嘗試動態數

在你WidgetProviderClass:

int randomNumber=(int)(Math.random()*1000); 
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId+randomNumber); 

      intent.setData(Uri.fromParts("content", String.valueOf(appWidgetId), null)); 

      intent.putExtra("random",randomNumber); 
      intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME))); 
      rv = new RemoteViews(context.getPackageName(), R.layout.widget_layout); 

而在你RemoteViewsFactory類,這樣做:

AppWidgetId = Integer.valueOf(intent.getData().getSchemeSpecificPart());