2013-11-09 32 views
2

我正在为任务列表应用程序实现小部件。它并没有真正意义的更新部件上的间隔,所以我想无论用户添加或删除任务,例如更新插件:Android AppWidget onUpdate并不总是更新小部件

private void updateWidget() { 
    Intent intent = new Intent(mContext, WidgetProvider.class); 
    intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE); 
    int ids[] = AppWidgetManager.getInstance(mContext).getAppWidgetIds(
      new ComponentName(mContext, WidgetProvider.class)); 
    intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, ids); 
    mContext.sendBroadcast(intent); 
} 

这里是WidgetProvider类的onUpdate方法(唯一重写的方法):

@Override 
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { 
    if (appWidgetIds != null) { 
     for (int i = 0; i < appWidgetIds.length; i++) { 
      Intent intent = new Intent(context, WidgetService.class); 
      intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetIds[i]); 
      intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME))); 
      RemoteViews widget = new RemoteViews(context.getPackageName(), R.layout.widget_layout); 

      widget.setRemoteAdapter(appWidgetIds[i], R.id.widget_listview, intent); 

      appWidgetManager.updateAppWidget(appWidgetIds[i], widget); 
     } 
    } 
    super.onUpdate(context, appWidgetManager, appWidgetIds); 
} 

的WidgetService类的onGetViewFactory方法:

@Override 
public RemoteViewsFactory onGetViewFactory(Intent intent) { 
    return new TaskViewsFactory(getBaseContext()); 
} 

且相应的清单的初步认识部分:

<receiver 
     android:name="com.nick.android.todo.widget.WidgetProvider" 
     android:enabled="true" 
     android:exported="true" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> 
     </intent-filter> 

     <meta-data 
      android:name="android.appwidget.provider" 
      android:resource="@xml/widget_provider" /> 
    </receiver> 

    <service 
     android:name="com.nick.android.todo.widget.WidgetService" 
     android:enabled="true" 
     android:permission="android.permission.BIND_REMOTEVIEWS" /> 

如果我删除并将小部件添加到主屏幕,则列表将正确填充。添加任务有时会随机发挥作用,但我无法弄清楚为什么/为什么不。

编辑:似乎我的WidgetService.onGetViewFactory()并不总是被调用。 (这些小部件在更新时会更新)

+0

是当你每次发送Brooadcast的onUpdate()叫什么名字? –

+0

@GopalRao是的。 –

回答

3

我终于明白了。

小部件确实在更新,但具有相同的项目。我需要重写onDataSetChanged()来获取项目的一个新的列表,并调用notifyAppWidgetViewDataChanged:

appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetIds, R.id.widget_listview);