2014-10-08 72 views
0

我写了下面的类:

public class Company implements Parcelable { 

private int uid; 
@SerializedName("field_user_org_name_value") 
private String name; 
@SerializedName("field_user_org_address_value") 
private String address; 
@SerializedName("field_user_org_category_tid") 
private int category; 
@SerializedName("field_user_org_town_tid") 
private int cityId; 
@SerializedName("image") 
private String imageUrl; 
private int online; 
@SerializedName("field_user_org_description_value") 
private String description; 
@SerializedName("field_user_org_phone_value") 
private String mobPhone; 
@SerializedName("field_user_org_stac_phone_value") 
private String phone; 

public ArrayList<Queue> getQueues() { 
    return queues; 
} 

@SerializedName("value_array") 
private ArrayList<Queue> queues; 

double lat; 
double lng = 0; 
double distance; 


public double getDistance() { 
    return distance; 
} 

public void setDistance(double distance) { 
    this.distance = distance; 
} 

public double getLng() { 
    return lng; 
} 

public void setLng(double lng) { 
    this.lng = lng; 
} 

public double getLat() { 
    return lat; 
} 

public void setLat(double lat) { 
    this.lat = lat; 
} 

public String getDescription() { 
    return description; 
} 

public String getMobPhone() { 
    return mobPhone; 
} 

public String getPhone() { 
    return phone; 
} 

public int getOnline() { 
    return online; 
} 

public Company(Parcel in) { 
    uid = in.readInt(); 
    name = in.readString(); 
    address = in.readString(); 
    category = in.readInt(); 
    cityId = in.readInt(); 
    imageUrl = in.readString(); 
    online = in.readInt(); 
    description = in.readString(); 
    mobPhone = in.readString(); 
    phone = in.readString(); 
    lat = in.readDouble(); 
    lng = in.readDouble(); 
    distance = in.readDouble(); 
    Parcelable[] parcelableArray = in.readParcelableArray(Queues.class.getClassLoader()); 
    Queue[] resultArray = null; 
    if (parcelableArray != null) { 
     resultArray = Arrays.copyOf(parcelableArray, parcelableArray.length, Queue[].class); 
    } 
    queues =(ArrayList) Arrays.asList(resultArray); 
} 

public int getUid() { 
    return uid; 
} 

public String getName() { 
    return name; 
} 

public String getAddress() { 
    return address; 
} 

public int getCategory() { 
    return category; 
} 

public int getCityId() { 
    return cityId; 
} 

public String getImageUrl() { 
    return imageUrl; 
} 

@Override 
public int describeContents() { 
    return 0; 
} 

@Override 
public void writeToParcel(Parcel dest, int flags) { 
    dest.writeInt(uid); 
    dest.writeString(name); 
    dest.writeString(address); 
    dest.writeInt(category); 
    dest.writeInt(cityId); 
    dest.writeString(imageUrl); 
    dest.writeInt(online); 
    dest.writeString(description); 
    dest.writeString(mobPhone); 
    dest.writeString(phone); 
    dest.writeDouble(lat); 
    dest.writeDouble(lng); 
    dest.writeDouble(distance); 
    Queue[] queueArray = new Queue[queues.size()]; 
    dest.writeParcelableArray(queues.toArray(queueArray), 0); 
} 

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

    @Override 
    public Object createFromParcel(Parcel source) { 
     return new Company(source); 
    } 

    @Override 
    public Object[] newArray(int size) { 
     return new Company[size]; 
    } 
}; 


public static class CustomComparator implements Comparator<Company> { 
    @Override 
    public int compare(Company o1, Company o2) { 
     return o1.getName().compareTo(o2.getName()); 
    } 
} 

public static class CustomComparatorDistance implements Comparator<Company> { 
    @Override 
    public int compare(Company o1, Company o2) { 
     return Double.compare(o1.getDistance(), o2.getDistance()); 
    } 
} 

public static class Queue implements Parcelable { 
    public int getCondition() { 
     return condition; 
    } 

    public String getTime() { 
     return time; 
    } 

    /** 
    * 0 - Free 
    * 1 - Busy 
    * 2 - Not working 
    */ 
    @SerializedName("sel") 
    int condition; 
    String time; 

    @Override 
    public int describeContents() { 
     return 0; 
    } 

    @Override 
    public void writeToParcel(Parcel dest, int flags) { 
     dest.writeInt(condition); 
     dest.writeString(time); 
    } 

    public Queue(Parcel in) { 

     condition = in.readInt(); 
     time = in.readString(); 
    } 

    public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { 
     public Object createFromParcel(Parcel in) { 
      return new Queue(in); 
     } 

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

而且WHN我想存储对象onother片段我得到这个例外:

java.lang.RuntimeException: Unable to start activity ComponentInfo{khuta.freeturn/khuta.freeturn.fragments.CompanyInfoActivity}: java.lang.ClassCastException: java.util.Arrays$ArrayList cannot be cast to java.util.ArrayList 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2184) 
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2233) 
     at android.app.ActivityThread.access$800(ActivityThread.java:135) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196) 
     at android.os.Handler.dispatchMessage(Handler.java:102) 
     at android.os.Looper.loop(Looper.java:136) 
     at android.app.ActivityThread.main(ActivityThread.java:5001) 
     at java.lang.reflect.Method.invokeNative(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:515) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) 
     at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.ClassCastException: java.util.Arrays$ArrayList cannot be cast to java.util.ArrayList 
     at khuta.freeturn.models.Company.<init>(Company.java:106) 
     at khuta.freeturn.models.Company$1.createFromParcel(Company.java:161) 
     at android.os.Parcel.readParcelable(Parcel.java:2104) 
     at android.os.Parcel.readValue(Parcel.java:2013) 
     at android.os.Parcel.readArrayMapInternal(Parcel.java:2314) 
     at android.os.Bundle.unparcel(Bundle.java:249) 
     at android.os.Bundle.getParcelable(Bundle.java:1206) 
     at android.content.Intent.getParcelableExtra(Intent.java:4652) 
     at khuta.freeturn.fragments.CompanyInfoActivity.onCreate(CompanyInfoActivity.java:77) 
     at android.app.Activity.performCreate(Activity.java:5231) 

我已阅读casting Arrays.asList causing exception: java.util.Arrays$ArrayList cannot be cast to java.util.ArrayList但它并没有帮助我。我会很高兴得到任何帮助

错误在这行

queues =(ArrayList) Arrays.asList(resultArray); 
+0

'队列'不是'可Parcelable'。 – kcoppock 2014-10-08 20:11:54

+0

public static class Queue implements Parcelable – 2014-10-08 20:12:43

+0

Queue是你自己的类中的一个吗?不是'java.util.Queue'? – kcoppock 2014-10-08 20:13:17

回答

2

你需要你的领域queue的类型更改为List<Queue>而非ArrayList<Queue>。你还需要改变

queues = (ArrayList) Arrays.asList(resultArray); 

queues = (List<Queue>) Arrays.asList(resultArray); 

它的失败的原因是,Arrays.asList()返回List但不一定是ArrayList。你不知道将被返回的确切类型,所以你应该投到List

List是一个泛型类型,因此您应该包含类型参数,并将其转换为List<Queue>而不是List。 (如果你只是使用List,你会得到一个编译器警告。)

顺便说一下,通常是避免也被标准JDK类(如Queue)使用的类名的好主意。这会让任何读取你的代码的人感到困惑,并且更有可能你会在某个时候意外地使用错误的import

+1

或者'queues = new ArrayList (Arrays.asList(resultArray));' – kcoppock 2014-10-08 20:14:49

+0

@kcoppock可以,但除非你确实需要它是一个'ArrayList',否则这只会减慢速度。 – 2014-10-08 20:17:21

+0

同意! :)只是一个选项。 – kcoppock 2014-10-08 20:17:39

相关问题