2013-10-15 5 views
9

Ich arbeite an Widget für meine Anwendung, die auf StackView basiert und sollte einige Elemente anzeigen. Anzahl der Elemente kann aufgrund von Benutzeraktionen variieren - nehmen wir an, es handelt sich um eine Art Favoritenmenü. Ich habe RemoteViewsFactory Nachkommen zu erzeugen Ansichten für StackView umgesetzt:RemoteViewsFactory namens getViewAt, wenn der leere Datensatz

public class StackRemoteViewsFactory implements RemoteViewsFactory { 

    private List<Item> data; 
    private Context context; 

    public StackRemoteViewsFactory(Context context) { 
     this.context = context; 
     data = new DAO(context).getFavouriteCards(); 
    } 

    @Override 
    public void onDataSetChanged() { 
     data = new DAO(context).getWidgetItems(); // refresh widget dataset 
    } 

    @Override 
    public int getCount() { 
      return data.size(); 
    } 

    @Override 
    public RemoteViews getViewAt(int position) { 
     Item item = data.get(position); 
     // this is my problem and will be explained below - 
     // here I'm getting IndexOutOfBoundsException, position = 0 

      ... 
    } 
    // I have omitted other methods to avoid verbosity 
} 

Alle funktionieren gut auf dem ersten Widget Start - Widget erfolgreich zeigt leer und alles gut geht. Nachdem ich einige neue Element zu den Favoriten hinzugefügt benachrichtigen ich AppWidgetManager sofort:

AppWidgetManager widgetManager = AppWidgetManager.getInstance(getActivity()); 
ComponentName component = new ComponentName(getActivity(), MyWidgetProvider.class); 
int[] widgetIds = widgetManager.getAppWidgetIds(component); 
widgetManager.notifyAppWidgetViewDataChanged(widgetIds, R.id.widgets_stack); 

Alles ist gut an diesem Punkt - Daten-Set erfolgreich geändert, und ich sehe mein Lieblingsstück auf Widget. Aber wenn ich mein einziges Element aus Favoriten entfernen und Favoriten werden leer (AppWidgetManager natürlich benachrichtigt) Ich erhalte IndexOutOfBoundsException in meinem getViewAtMethod:

10-15 17:26:36.810: E/AndroidRuntime(30964): java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0 

Als erstes habe ich überprüft habe, was getCount() kehrt nach onDataSetChanged() Feuer - es war 0 Also verstehe ich nicht warum RemoteViewsFactory ruft getViewAt() wenn getCount() 0 zurückgibt. Soweit ich verstehe, ist RemoteViewFactory wie ein gewöhnlicher Adapter, so dass dieses Verhalten mich völlig verwirrt. Vielleicht sind meine Vorschläge falsch und ich mache etwas falsch?

UPDATE
Heute habe ich mein Widget-Layout geändert ListView statt StackView zu verwenden, bei dem Versuch, einige gui Fehler zu beheben. Und alles funktioniert jetzt gut. Weiteres Experiment zeigt, dass AdapterViewFlipper dasselbe Problem wie StackView haben. Soweit ich verstanden habe, gibt es einige Aspekte, die mit AdapterViewAnimator Nachkommen arbeiten - kann jemand meine Annahme bestätigen/widerlegen?

+1

Ich weiß, das ist ziemlich alt, aber ich zufällig auf denen sie laufen das gleiche Problem. Der Datensatz wird aktualisiert, aber irgendwie verwendet die RemoteViewsFactory einen alten Wert von "getCount". Hast du etwas anderes gefunden? – mdelolmo

+0

@mdelolmo Leider habe ich keine Lösung für dieses Problem gefunden und mein Widget überarbeitet, um einzelne Elemente anzuzeigen und durch Elemente zu navigieren, indem < and > Schaltflächen verwendet werden. – Viacheslav

+0

Die Antwort unten löste dieses Problem für mich. Es ist ein Workaround, aber ein nettes :) –

Antwort

10

Das gleiche Problem hier. Da die Lösung noch nicht kommt (Android 4.4 hier und es passiert immer noch), denke ich, die beste Lösung für den Moment ist im Grunde eine Workaround, um den Absturz zu vermeiden. Einige Entwickler nennen es „Hack“ ...

Vorerst:

public RemoteViews getViewAt(int position) { 

    if (position >= getCount()) 
      return getLoadingView(); 
    } 
    //.... Rest of your normal configuration 
} 

Vergewissern Sie sich eine Ansicht zurückkehren richtig auf getLoadingView()

+1

Das hat bei mir funktioniert. Es stürzt (bis jetzt) ​​nicht mehr ab, und es scheint, als würde man über diesen Fall springen und die "leere" Widget-Ansicht zeigen, was ich sowieso wollte. Ich frage mich, ob dies ein Problem mit StackViews ist. – Nlinscott

Verwandte Themen