Actualizar Android ListView en Widget

Tengo un problema con mi App-Widget cuando intento actualizar el contenido.

El widget se ve así: http://i.stack.imgur.com/tEGLv.jpg

El Widget consiste en un Encabezado (Botones + TextViews) y un ListView. Si el Usuario presiona un botón, el ListView muestra el contenido del día siguiente y todo funciona bien. Pero el problema es que si intento actualizar el widget desde mi aplicación o automáticamente el timeperiod la actualización de ListView doenst.

Aquí el código de mi.

AppWidgetProvider:

public class StudyWidgetProvider extends AppWidgetProvider{ private static String BUTTON_BACK = "BUTTON_BACK"; private static String BUTTON_FORWARD = "BUTTON_FORWARD"; @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { context.startService(new Intent(context, UpdateService.class)); } @Override public void onReceive(Context context, Intent intent) { super.onReceive(context, intent); if(WidgetViewsFactory.currentDate == null){ WidgetViewsFactory.currentDate = Calendar.getInstance(); } String action = intent.getAction(); if(action != null){ if(action.equals(BUTTON_BACK)){ WidgetViewsFactory.currentDate.add(Calendar.DATE, -1); } if(action.equals(BUTTON_FORWARD)){ WidgetViewsFactory.currentDate.add(Calendar.DATE, 1); } } context.startService(new Intent(context, UpdateService.class)); } } 

UpdateService que maneja la actualización del Widget.

  @Override @Deprecated public void onStart(Intent intent, int startId) { super.onStart(intent, startId); Log.i(LOG_TAG, "Update-Service started"); RemoteViews widget = buildUpdate(this); ComponentName thisWidget = new ComponentName(this, StudyWidgetProvider.class); AppWidgetManager manager = AppWidgetManager.getInstance(this); manager.notifyAppWidgetViewDataChanged(manager.getAppWidgetIds(thisWidget), R.id.words); manager.updateAppWidget(thisWidget, widget); Log.i(LOG_TAG, "The Content!"); if(widgetObjects == null){ Log.i(LOG_TAG, "WidgetObjects sind NULL"); } else { Log.i(LOG_TAG, "WidgetObjects sind NICHT-NULL"); for(int i=0; i<widgetObjects.size(); i++){ Log.i(LOG_TAG, "--- " + widgetObjects.get(i).getName()); } } Log.i(LOG_TAG, "Update-Service ended"); } public RemoteViews buildUpdate(Context context){ RemoteViews retVal = new RemoteViews(context.getPackageName(), R.layout.widget); if(WidgetViewsFactory.currentDate == null){ WidgetViewsFactory.currentDate = Calendar.getInstance(); } AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); ComponentName thisAppWidget = new ComponentName(context.getPackageName(), StudyWidgetProvider.class.getName()); int[] appWidgetIds = appWidgetManager.getAppWidgetIds(thisAppWidget); loadSDCardContent(context, appWidgetManager, appWidgetIds); //Setzen des Widget-UIs Intent intent = new Intent(context, WidgetService.class); intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetIds); intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME))); retVal.setRemoteAdapter(R.id.words, intent); SimpleDateFormat dateFormater = new SimpleDateFormat("EEEE"); retVal.setTextViewText(R.id.widget_day, dateFormater.format(WidgetViewsFactory.currentDate.getTime())); dateFormater = new SimpleDateFormat("dd.MM.yyyy"); retVal.setTextViewText(R.id.widget_date, dateFormater.format(WidgetViewsFactory.currentDate.getTime())); //Button-Actions Intent backIntent = new Intent(context, StudyWidgetProvider.class); backIntent.setAction(BUTTON_BACK); Intent forwardIntent = new Intent(context, StudyWidgetProvider.class); forwardIntent.setAction(BUTTON_FORWARD); PendingIntent backPendingIntent = PendingIntent.getBroadcast(context, 0, backIntent, PendingIntent.FLAG_UPDATE_CURRENT); PendingIntent forwardPendingIntent = PendingIntent.getBroadcast(context, 0, forwardIntent, PendingIntent.FLAG_UPDATE_CURRENT); retVal.setOnClickPendingIntent(R.id.widget_but_back, backPendingIntent); retVal.setOnClickPendingIntent(R.id.widget_but_forward, forwardPendingIntent); Intent clickIntent = new Intent(context, WidgetActivity.class); PendingIntent clickPI=PendingIntent.getActivity(context, 0, clickIntent, PendingIntent.FLAG_UPDATE_CURRENT); retVal.setPendingIntentTemplate(R.id.words, clickPI); return retVal; } 

Y heres cómo actualizar el widget de mi aplicación:

 public RemoteViews buildUpdate(Context context){ RemoteViews retVal = new RemoteViews(context.getPackageName(), R.layout.widget); if(WidgetViewsFactory.currentDate == null){ WidgetViewsFactory.currentDate = Calendar.getInstance(); } AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); ComponentName thisAppWidget = new ComponentName(context.getPackageName(), StudyWidgetProvider.class.getName()); int[] appWidgetIds = appWidgetManager.getAppWidgetIds(thisAppWidget); loadSDCardContent(context, appWidgetManager, appWidgetIds); //Setzen des Widget-UIs Intent intent = new Intent(context, WidgetService.class); intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetIds); intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME))); retVal.setRemoteAdapter(R.id.words, intent); SimpleDateFormat dateFormater = new SimpleDateFormat("EEEE"); retVal.setTextViewText(R.id.widget_day, dateFormater.format(WidgetViewsFactory.currentDate.getTime())); dateFormater = new SimpleDateFormat("dd.MM.yyyy"); retVal.setTextViewText(R.id.widget_date, dateFormater.format(WidgetViewsFactory.currentDate.getTime())); //Button-Actions Intent backIntent = new Intent(context, StudyWidgetProvider.class); backIntent.setAction(BUTTON_BACK); Intent forwardIntent = new Intent(context, StudyWidgetProvider.class); forwardIntent.setAction(BUTTON_FORWARD); PendingIntent backPendingIntent = PendingIntent.getBroadcast(context, 0, backIntent, PendingIntent.FLAG_UPDATE_CURRENT); PendingIntent forwardPendingIntent = PendingIntent.getBroadcast(context, 0, forwardIntent, PendingIntent.FLAG_UPDATE_CURRENT); retVal.setOnClickPendingIntent(R.id.widget_but_back, backPendingIntent); retVal.setOnClickPendingIntent(R.id.widget_but_forward, forwardPendingIntent); Intent clickIntent = new Intent(context, WidgetActivity.class); PendingIntent clickPI=PendingIntent.getActivity(context, 0, clickIntent, PendingIntent.FLAG_UPDATE_CURRENT); retVal.setPendingIntentTemplate(R.id.words, clickPI); return retVal; } 

La cosa extraña es cuando golpeo el botón del widget, everythings trabaja como deseo. El método onDatasetChanged de mi listview se llama y el contenido está cambiando, pero si lo intento desde mi aplicación nada pasa

Espero que alguien de ustedes tenga una idea de por qué esto no está funcionando. Im pegado en esto por ahora 2 días y no tengo ninguna pista …

¡Gracias por ayudar!

EDIT Ive descubrió que esto no está funcionando en mi dispositivo (htc con miui v4) sino en el emulador.

EDIT 2 He instalado Android 4 (con Sense 4) en mi dispositivo, y después de eso también funcionó. Parece que MIUI fue el problema.

Voy a necro esta pregunta porque tenía el mismo problema y encontré una solución.

  manager.notifyAppWidgetViewDataChanged 

Esto envía una llamada a onDataSetChanged () en su RemoteViewsFactory. Agregue una llamada para crear sus vistas en ese método. Esto solucionó todos mis problemas.

Comuníquese con el Widget sólo a través de Broadcasts. No lo llame directamente como esto. Use stickyBroadcasts si es necesario.

Esto funciona

  @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { super.onUpdate(context, appWidgetManager, appWidgetIds); for (int widgetId : appWidgetIds) { RemoteViews mView = initViews(context, appWidgetManager, widgetId); appWidgetManager.updateAppWidget(widgetId, mView); } super.onUpdate(context, appWidgetManager, appWidgetIds); } @SuppressWarnings("deprecation") @SuppressLint("NewApi") private RemoteViews initViews(Context context, AppWidgetManager widgetManager, int widgetId) { RemoteViews mView = new RemoteViews(context.getPackageName(), R.layout.widget_layout); Intent intent = new Intent(context, WidgetService.class); intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId); intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME))); mView.setRemoteAdapter(widgetId, R.id.widgetCollectionList, intent); return mView; } 
  • mensaje del widget android para desbloquear
  • Cómo cargar imágenes de la URL en el widget de la aplicación Android?
  • Cómo encontrar el continente en una ubicación determinada usando Geocoder en la aplicación android
  • Cómo configurar RecyclerView en el widget android
  • ¿Qué es exactamente un widget?
  • Cómo hacer widget de tamaño 4x1 en la pantalla de inicio de Android?
  • Android widget ¿cómo puede obtener el tiempo en hora y minuto de esto?
  • Widget Android: Cómo cambiar el texto de un botón
  • Widget de control de energía mostrado durante un breve momento al actualizar mi propio widget a través de AppWidgetManager, ¿cuál es el problema?
  • ¿Hay alguna manera de poner un campo EditText / entrada en un widget homescreen?
  • Recursos android de escala automática
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.