如何实现Parcelable含名单,其中一类;列表<字符串>>? [英] How to implement Parcelable for a class containing List<List<String>>?

查看:130
本文介绍了如何实现Parcelable含名单,其中一类;列表<字符串>>?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个工作 Parcelable implementaion所有在我Parcelable类中的字段除了名单,其中,名单,其中,字符串>>

  Employee类实现Parcelable {

    名单<列表<字符串>>细节;
    // .......

    保护员工(包裹的){
        细节=新的ArrayList<列表<字符串>>();
        //我知道这是错的只是发布澄清
        in.readList(细节,List.class.getClassLoader());
        // ......
    }

    公共无效writeToParcel(包裹DEST,INT标志){
        dest.writeList(详情);
        // .....
    }

    公众诠释describeContents(){
        返回0;
    }

    公共静态最终Parcelable.Creator<员工> CREATOR =
            新Parcelable.Creator<员工>(){
        公务员createFromParcel(包裹中){
            返回新员工(中);
        }

        公务员[] newArray(INT尺寸){
            返回新员工【尺寸】;
        }
    };

}
 

例外:

  05-10 19:07:44.072:E / AndroidRuntime(10661):java.lang.RuntimeException的:地块android.os.Parcel@42a509e8:由解组造成未知类型$ C $Ç3604535偏移量268
 

解决方案

扩展的ArrayList 和实施 Parcelable 就可以了为我工作。

 公共类ParcelableArrayList扩展的ArrayList<字符串>器物
        Parcelable {

    私有静态最后长的serialVersionUID = -8516873361351845306L;

    公共ParcelableArrayList(){
        超();
    }

    保护ParcelableArrayList(包裹中){
        in.readList(此,String.class.getClassLoader());
    }

    @覆盖
    公众诠释describeContents(){
        返回0;
    }

    @覆盖
    公共无效writeToParcel(包裹DEST,INT标志){
        dest.writeList(本);
    }

    公共静态最终Parcelable.Creator< ParcelableArrayList> CREATOR =
            新Parcelable.Creator< ParcelableArrayList>(){
        公共ParcelableArrayList createFromParcel(包裹中){
            返回新ParcelableArrayList(中);
        }

        公共ParcelableArrayList [] newArray(INT尺寸){
            返回新ParcelableArrayList【尺寸】;
        }
    };

}
 

和Employee类

  Employee类实现Parcelable {

    名单< ParcelableArrayList>细节;
    // .......

    保护员工(包裹的){
        细节=新的ArrayList< ParcelableArrayList>();
        in.readTypedList(详细信息,ParcelableArrayList.CREATOR);
        // ......
    }

    公共无效writeToParcel(包裹DEST,INT标志){
        dest.writeList(详情);
        // .....
    }

    公众诠释describeContents(){
        返回0;
    }

    公共静态最终Parcelable.Creator<员工> CREATOR =
            新Parcelable.Creator<员工>(){
        公务员createFromParcel(包裹中){
            返回新员工(中);
        }

        公务员[] newArray(INT尺寸){
            返回新员工【尺寸】;
        }
    };

}
 

I have a working Parcelable implementaion for all the fields in my Parcelable Class apart from List<List<String>>

class Employee implements Parcelable {

    List<List<String>> details;
    //.......

    protected Employee(Parcel in) {
        details = new ArrayList<List<String>>();
        // i know this is wrong just posting to clarify
        in.readList(details, List.class.getClassLoader());
        //......
    }

    public void writeToParcel(Parcel dest, int flags) {
        dest.writeList(details);
        //.....
    }

    public int describeContents() {
        return 0;
    }

    public static final Parcelable.Creator<Employee> CREATOR = 
            new Parcelable.Creator<Employee>() {
        public Employee createFromParcel(Parcel in) {
            return new Employee(in);
        }

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

}

Exception:

05-10 19:07:44.072: E/AndroidRuntime(10661): Caused by: java.lang.RuntimeException: Parcel android.os.Parcel@42a509e8: Unmarshalling unknown type code 3604535 at offset 268

解决方案

Extending ArrayList and implementing Parcelable on it worked for me.

public class ParcelableArrayList extends ArrayList<String> implements 
        Parcelable {

    private static final long serialVersionUID = -8516873361351845306L;

    public ParcelableArrayList(){
        super();
    }

    protected ParcelableArrayList(Parcel in) {
        in.readList(this, String.class.getClassLoader());
    }

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

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeList(this);
    }   

    public static final Parcelable.Creator<ParcelableArrayList> CREATOR = 
            new Parcelable.Creator<ParcelableArrayList>() {
        public ParcelableArrayList createFromParcel(Parcel in) {
            return new ParcelableArrayList(in);
        }

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

}

and Employee class

class Employee implements Parcelable {

    List<ParcelableArrayList> details;
    //.......

    protected Employee(Parcel in) {
        details = new ArrayList<ParcelableArrayList>();
        in.readTypedList(details,ParcelableArrayList.CREATOR);
        //......
    }

    public void writeToParcel(Parcel dest, int flags) {
        dest.writeList(details);
        //.....
    }

    public int describeContents() {
        return 0;
    }

    public static final Parcelable.Creator<Employee> CREATOR = 
            new Parcelable.Creator<Employee>() {
        public Employee createFromParcel(Parcel in) {
            return new Employee(in);
        }

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

}

这篇关于如何实现Parcelable含名单,其中一类;列表&LT;字符串&GT;&GT;?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆