Domanda

Voglio salvare un elenco di Parcelable Restaurant oggetti su onSaveInstanceState. Ho creato una categoria Ristorante estende Parcelable e un oggetto RestaurantList, entrambi mostrato di seguito. Nella mia attività principale riempio il mio RestauranList direttamente dai dati JSON Internet utilizzando GSON:

restaurantList = gson.fromJson(r, RestaurantList.class);

Ora, quando voglio salvare l'elenco di Restaurant oggetti utilizzando

protected void onSaveInstanceState(Bundle outState) {           

    if (restaurantList != null ) {      
        outState.putParcelableArrayList("restoList", (ArrayList<Restaurant>)restaurantList.getRestaurants());
    }       

    super.onSaveInstanceState(outState);
}

ottengo un errore (vedi sotto), credo perché i dati Parcelable non sono scritti. Come devo fare? Devo creare un array di oggetti Parcel nella mia attività principale e riempirlo chiamando writeToParcel per ciascuno degli oggetti ristorante?

grazie per ogni suggerimento

Julien

++++++

LogCat (si blocca in outState.putParcelableArrayList ( "restoList", (ArrayList) restaurantList.getRestaurants ()); )

07-05 19:34:13.846: WARN/ActivityManager(563): Activity pause timeout for HistoryRecord{436950f8 {org.digitalfarm.atable/org.digitalfarm.atable.Atable}}
07-05 19:34:28.336: DEBUG/AndroidRuntime(808): Shutting down VM
07-05 19:34:28.336: WARN/dalvikvm(808): threadid=3: thread exiting with uncaught exception (group=0x4000fe70)
07-05 19:34:28.336: ERROR/AndroidRuntime(808): Uncaught handler: thread main exiting due to uncaught exception
07-05 19:34:28.637: DEBUG/dalvikvm(808): GC freed 3337 objects / 259288 bytes in 94ms
07-05 19:34:28.647: ERROR/AndroidRuntime(808): java.lang.RuntimeException: Unable to pause activity {org.digitalfarm.atable/org.digitalfarm.atable.Atable}: java.lang.ClassCastException: java.util.LinkedList
07-05 19:34:28.647: ERROR/AndroidRuntime(808):     at android.app.ActivityThread.performPauseActivity(ActivityThread.java:2840)
07-05 19:34:28.647: ERROR/AndroidRuntime(808):     at android.app.ActivityThread.performPauseActivity(ActivityThread.java:2797)
07-05 19:34:28.647: ERROR/AndroidRuntime(808):     at android.app.ActivityThread.handlePauseActivity(ActivityThread.java:2780)
07-05 19:34:28.647: ERROR/AndroidRuntime(808):     at android.app.ActivityThread.access$2000(ActivityThread.java:112)
07-05 19:34:28.647: ERROR/AndroidRuntime(808):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1699)
07-05 19:34:28.647: ERROR/AndroidRuntime(808):     at android.os.Handler.dispatchMessage(Handler.java:99)
07-05 19:34:28.647: ERROR/AndroidRuntime(808):     at android.os.Looper.loop(Looper.java:123)
07-05 19:34:28.647: ERROR/AndroidRuntime(808):     at android.app.ActivityThread.main(ActivityThread.java:3948)
07-05 19:34:28.647: ERROR/AndroidRuntime(808):     at java.lang.reflect.Method.invokeNative(Native Method)
07-05 19:34:28.647: ERROR/AndroidRuntime(808):     at java.lang.reflect.Method.invoke(Method.java:521)
07-05 19:34:28.647: ERROR/AndroidRuntime(808):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:782)
07-05 19:34:28.647: ERROR/AndroidRuntime(808):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:540)
07-05 19:34:28.647: ERROR/AndroidRuntime(808):     at dalvik.system.NativeStart.main(Native Method)
07-05 19:34:28.647: ERROR/AndroidRuntime(808): Caused by: java.lang.ClassCastException: java.util.LinkedList
07-05 19:34:28.647: ERROR/AndroidRuntime(808):     at org.digitalfarm.atable.Atable.onSaveInstanceState(Atable.java:254)
07-05 19:34:28.647: ERROR/AndroidRuntime(808):     at android.app.Activity.performSaveInstanceState(Activity.java:1008)
07-05 19:34:28.647: ERROR/AndroidRuntime(808):     at android.app.Instrumentation.callActivityOnSaveInstanceState(Instrumentation.java:1256)
07-05 19:34:28.647: ERROR/AndroidRuntime(808):     at android.app.ActivityThread.performPauseActivity(ActivityThread.java:2822)
07-05 19:34:28.647: ERROR/AndroidRuntime(808):     ... 12 more

class RestaurantList

public class RestaurantList {

    private List<Restaurant> restaurants = new ArrayList<Restaurant>();

    public int getSize() {
        return restaurants.size();          
    }

    public List<Restaurant> getRestaurants() {
        return this.restaurants;
    }       

    public Restaurant getRestaurant(int i) {
        return this.restaurants.get(i);
    }

    public void setRestaurants(List<Restaurant> restaurants) {
        this.restaurants = restaurants;
    }

    public List<String> getRestaurantNames() {

        List<String> restaurantNames = new ArrayList<String>();

        for (int i=0; i<this.restaurants.size(); i++) {
            restaurantNames.add(this.restaurants.get(i).getName());             
        }

        return restaurantNames;
    }

}

categoria Ristorante

public class Restaurant implements Parcelable{

    private String name;
    /* more stuff */

    public Restaurant() {}          

    public String getName() {
        return this.name;   
    }

    public void setName(String name) {
        this.name = name;
    }       

    public void writeToParcel(Parcel out, int flags) {  

        out.writeStringArray(new String[] {this.name, /* more stuff*/});            

    }

    public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {

            public Restaurant createFromParcel(Parcel in) { return new Restaurant(in); }

            public Restaurant[] newArray(int size) { return new Restaurant[size]; }

    };


    private Restaurant(Parcel in) {

        String[] stringData = new String[6];                

        in.readStringArray(stringData);

        this.name = stringData[0];  
                /* more stuff */     

    }       

    public int describeContents(){ 
        return 0;
    }


}
È stato utile?

Soluzione

hai trovato la ClassCastException perché la vostra lista è una LinkedList e si sta lanciando a un ArrayList, che sta gettando l'eccezione. Non sembra essere qualcosa di sbagliato con la vostra categoria Ristorante.

Si dovrebbe solo utilizzare ArrayList per la vostra lista Parcelable, non vedo il motivo per cui si avrebbe bisogno di una classe RestaurantList separata.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top