2012-10-13 345 views
10

Busqué en Google y encontré el código para manipular los datos de la vista de lista usando RemoteViewsService y RemoteViewsService.RemoteViewsFactory. como a continuaciónAndroid - Widget con Scroll Listview Manual Refresh

Intent svcIntent = new Intent(context, WidgetService.class); 
svcIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,appWidgetIds[i]); 
svcIntent.setData(Uri.parse(svcIntent.toUri(Intent.URI_INTENT_SCHEME))); 
RemoteViews widget = new RemoteViews(context.getPackageName(),R.layout.widget_layout); 
widget.setRemoteAdapter(appWidgetIds[i], R.id.lstAppointments,svcIntent); 

WidgetService.java contiene

public class WidgetService extends RemoteViewsService { 

    @Override 
    public RemoteViewsFactory onGetViewFactory(Intent intent) { 
     return (new WidgetViewsFactory(this.getApplicationContext(), intent)); 
    } 

    public IBinder onBind(Intent intent) { 
     // TODO Auto-generated method stub 
     return super.onBind(intent); 
    } 
} 

y escribió todos los códigos para ir a buscar los datos de servicio web en onCreate de WidgetViewsFactory implementa RemoteViewsService.RemoteViewsFactory

Para actualizar los registros de forma manual o automáticamente cada 5 segundos, encontré la actualización a través de los métodos de servicio como se menciona a continuación

public class WordWidget extends AppWidgetProvider { 

    static int value = 1; 
    Handler handler = new Handler(); 
    MyRunnable myRunnable; 

    @Override 
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, 
      int[] appWidgetIds) { 
     // To prevent any ANR timeouts, we perform the update in a service 
     myRunnable = new MyRunnable(context); 
     handler.postDelayed(myRunnable, 1000); 
    } 

    class MyRunnable implements Runnable { 

     Context context; 

     public MyRunnable(Context context) { 
      this.context = context; 
     } 

     public void run() { 
      context.startService(new Intent(context, UpdateService.class)); 
      handler.postDelayed(myRunnable, 1000); 
     } 
    } 

    public static class UpdateService extends Service { 
     @Override 
     public void onStart(Intent intent, int startId) { 
      // Build the widget update for today 
      RemoteViews updateViews = buildUpdate(this); 

      // Push update for this widget to the home screen 
      ComponentName thisWidget = new ComponentName(this, WordWidget.class); 
      AppWidgetManager manager = AppWidgetManager.getInstance(this); 
      manager.updateAppWidget(thisWidget, updateViews); 
     } 

     public RemoteViews buildUpdate(Context context) { 
      RemoteViews updateViews; 

      // Build an update that holds the updated widget contents 
      updateViews = new RemoteViews(context.getPackageName(), 
        R.layout.widget_word); 

      Log.e("value", String.valueOf(value)); 
      updateViews.setTextViewText(R.id.word_title, "Title"); 
      updateViews.setTextViewText(R.id.word_type, String.valueOf(value)); 
      updateViews.setTextViewText(R.id.definition, String.valueOf(value)); 

      value += 1; 

      // When user clicks on widget it opens www.google.com 
      Intent defineIntent = new Intent(Intent.ACTION_VIEW, 
        Uri.parse("https://www.google.co.in/")); 
      PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, 
        defineIntent, 0); 
      updateViews.setOnClickPendingIntent(R.id.widget, pendingIntent); 

      return updateViews; 
     } 

     @Override 
     public IBinder onBind(Intent intent) { 
      // We don't need to bind to this service 
      return null; 
     } 
    } 
} 

Cómo actualizar la vista de lista automáticamente ... Sé cómo actualizar la vista de texto como se menciona arriba.

Respuesta

48

Puede actualizar el ListView utilizando el método notifyAppWidgetViewDataChanged() de AppWidgetManager. Usted tendrá que obtener la instancia de AppWidgetManager, se obtienen AppWidgetIds y la llamada appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetIds, viewId);

Código Pseudo,

AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); 
int appWidgetIds[] = appWidgetManager.getAppWidgetIds(
          new ComponentName(context, WidgetProvider.class)); 
appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetIds, R.id.listview); 

Cuando se llama a notifyAppWidgetViewDataChanged() entonces el método de RemoteViewsFactoryonDataSetChanged() será llamada que está sirviendo como un adaptador para su ListView. Puede hacer cosas del servicio web y otras operaciones en onDataSetChanged(), obtener la respuesta y agregarla a su conjunto de datos que tal vez ArrayList o cualquier colección.

Para obtener más lecturas/referencias, puede consultar Keeping Collection Data Fresh parte de los documentos. También puede consultar un ejemplo de demostración de mi github.

+4

Tnx genious. :) –

+1

Después de mirar muchos hilos en este sitio y ninguno funcionó para mí (probablemente porque estoy usando un "Widget de colección"), ¡este funcionó como un encanto! ¡Muchas gracias! –

+1

estaba usando sendBroadcast(), que a su vez estaba recreando cada diseño, y no estaba actualizando las listas. El método notifyAppWidgetViewDataChanged solo se ocupa de la actualización, lo que lo hace menos costoso. –