2012-10-13 9 views
10

Ich googelte und fand den Code zum Bearbeiten von Listview-Daten mit RemoteViewsService und RemoteViewsService.RemoteViewsFactory. wie untenAndroid - Widget mit scrollbaren Listview Handbuch 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

enthält
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); 
    } 
} 

und schrieb alle Codes für in onCreate von WidgetViewsFactory Daten von Webservice Abrufen implementiert RemoteViewsService.RemoteViewsFactory

Für Aufzeichnungen manuell aktualisieren oder automatisch alle 5 Sekunden fand ich Update über Service-Methoden wie unten erwähnt

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; 
     } 
    } 
} 

Wie aktualisiert man die Listview automatisch ... Ich weiß, wie man Textview wie oben erwähnt aktualisiert.

Antwort

48

Sie können die ListView mit notifyAppWidgetViewDataChanged() Methode von AppWidgetManager aktualisieren. Sie werden die Instanz von AppWidgetManager erhalten müssen, die AppWidgetIds bekommen und den Anruf appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetIds, viewId);

Pseudo-Code,

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

Wenn Sie anrufen notifyAppWidgetViewDataChanged() dann die onDataSetChanged() Methode der RemoteViewsFactory wird aufgerufen, die als Adapter dient für Ihre ListView. Sie können Web-Service-Stuff und andere Operationen in onDataSetChanged() tun, erhalten Sie die Antwort und fügen Sie es zu Ihrem Datensatz, die ArrayList oder eine solche Sammlung.

Für weitere Messungen/Referenz können Sie überprüfen Keeping Collection Data Fresh Teil aus der Dokumentation. Sie können auch ein Demo-Beispiel von meiner github überprüfen.

+4

Tnx genious. :) –

+1

Nachdem ich viele Threads auf dieser Seite angeschaut habe und keiner für mich gearbeitet hat (wahrscheinlich, weil ich ein "Collection Widget" verwende), hat dieses als Charme funktioniert! Vielen Dank! –

+1

Ich habe sendBroadcast() verwendet, die wiederum jedes Layout neu erstellt und die Listenansichten nicht aktualisiert hat. Die Methode notifyAppWidgetViewDataChanged sorgt nur für eine Aktualisierung, wodurch sie weniger teuer wird. –