2016-09-08 3 views
1

Ich erstelle eine Widget mit ListView darauf. Das Ergebnis der Web Service in der ListView Anzeige ist in Ordnung. Ich habe eine Klasse, die meine WidgetService ist, die sich auf RemoteViewsService und RemoteViewsFactory erstreckt. Ich rufe meine , die die Web Service hat. Ich habe eine Aktualisierungsschaltfläche hinzugefügt, die beim Klicken auf WidgetService erneut aufgerufen wird, um die Listenansicht zu erstellen.Wie wird die Widget-Listenansicht aktualisiert, wenn auf die Schaltfläche "Aktualisieren" geklickt wird?

Hier ist mein Code in meinem WidgetProvider

public class WidgetProvider extends AppWidgetProvider { 

    @Override 
public void onUpdate(Context context, AppWidgetManager appWidgetManager, 
        int[] appWidgetIds) { 
final int N = appWidgetIds.length; 
    for (int i = 0; i < N; ++i) { 
     RemoteViews remoteViews = updateWidgetListView(context, 
       appWidgetIds[i]); 
     appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetIds[i], R.id.listViewWidget); 
     appWidgetManager.updateAppWidget(appWidgetIds[i], remoteViews); 
    } 
    super.onUpdate(context, appWidgetManager, appWidgetIds); 
} 

private RemoteViews updateWidgetListView(Context context, int appWidgetId) { 

    RemoteViews remoteViews = new RemoteViews(context.getPackageName(), 
      R.layout.widget_layout); 

//ListView 
    Intent svcIntent = new Intent(context, WidgetService.class); 
    svcIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); 
    svcIntent.setData(Uri.parse(svcIntent.toUri(Intent.URI_INTENT_SCHEME))); 
    remoteViews.setRemoteAdapter(appWidgetId, R.id.listViewWidget, svcIntent); 
    remoteViews.setEmptyView(R.id.listViewWidget, R.id.empty_view); 

    //REFRESH 
    PendingIntent updatePendingIntent = PendingIntent.getService(context, 0, svcIntent, PendingIntent.FLAG_UPDATE_CURRENT); 
    remoteViews.setOnClickPendingIntent(R.id.ivRefreshWidget, updatePendingIntent); 

return remoteViews; 
} 

Wie Sie im Auffrischbeurteilungsteil sehen kann ich PendingIntent versucht, mit den WidgetService nennen, aber beim Testen sie die Liste nicht aktualisieren. Vielen Dank für die Hilfe im Voraus.

+0

antwortete ich es schon - http://stackoverflow.com/a/12907825/726863 Auch hier auch - http://stackoverflow.com/a/36005649/726863 –

+0

@LalitPoptani basierend auf den Link Ich sollte einen 'Service' anstelle von' RemoteViewsService' für meinen 'WidgetService' verwenden? – natsumiyu

+0

Auch @LalitPoptani Ich benutze 'notifyAppWidgetViewDataChanged' auf meinem' WidgetProvider' sollte ich es woanders hinlegen? Ich wollte die Aktualisierung auslösen, wenn auf die Schaltfläche geklickt wird. – natsumiyu

Antwort

0

In meinem onUpdate ich eine Aktion gesetzt in meinem onReceive, und auch die appWidgetIds als auch in der onReceive

Intent refreshIntent = new Intent(context, WidgetProvider.class); 
     refreshIntent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE); 
     refreshIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds); 
verwendet werden setzen aufgerufen werden

dann in onReceive Ich rufe die onUpdate

zuvor
if (intent.getAction().equals(AppWidgetManager.ACTION_APPWIDGET_UPDATE)) { 
     Bundle extras = intent.getExtras(); 
     if (extras != null) { 
      int[] appWidgetIds = extras.getIntArray(AppWidgetManager.EXTRA_APPWIDGET_IDS); 
      if (appWidgetIds != null && appWidgetIds.length > 0) { 
       Toast.makeText(context, "REFRESH", Toast.LENGTH_SHORT).show(); 
       this.onUpdate(context, AppWidgetManager.getInstance(context), appWidgetIds); 
      } 
     } 
    } 
+0

So wird der erste Code gehen das Anklicken des Buttons für den Button? Nun, das hat nicht funktioniert. Ich habe eine Aktualisierungsschaltfläche im Widget, die ich verwenden möchte, um das Widget selbst zu aktualisieren und 'OnUpdate' aufzurufen. Irgendeine Idee? – Si8

+0

@ Si8 zuerst müssen Sie die Schaltfläche in der 'OnUpdate' setzen und dann eine Aktion festlegen, für mich ist es' AppWidgetManager.ACTION_APPWIDGET_UPDATE' dann erhalten Sie die Aktion in 'onReceive', wo Sie die 'this.onUpdate()' – natsumiyu

+0

aufrufen http://stackoverflow.com/questions/40776920/how-to-manual-call-onupdate-from-within-the-widget-self Wenn Sie einen Blick werfen möchten ... – Si8

0
arrayList = new ArrayList<AllPostsProvider>(); 
arrayList.add(all_contents); 
AllPostReCyclerViewAdapter = new AllPostReCyclerViewAdapter(arrayList,getApplicationContext()); 

und wenn klicken refreash Taste

arrayList.clear(); 
arrayList = new ArrayList<AllPostsProvider>(); 
arrayList.add(all_contents); 
AllPostReCyclerViewAdapter = new AllPostReCyclerViewAdapter(arrayList,getApplicationContext()); 
+0

wo sollte es die 'arrayList.clear()' setzen? – natsumiyu

+0

Wenn Sie Refreash Button onclick Funktion aufrufen ... wird es innerhalb der – snehasish

+0

können Sie ein Beispiel geben, weil ich 'remoteViews.setOnClickPendingIntent (R.id.ivRefreshWidget, pendingServiceIntent);' – natsumiyu

Verwandte Themen