欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

关于使用putParcelableArrayList遇到的问题

程序员文章站 2022-07-13 17:15:06
...

这是自己决定写博客的第一篇,不喜勿喷。。。。

有时候我们在页面跳转时要把lis数据传给下一个页面,此时只需要定义一个bundle,然后使用bundle.putParcelableArrayList()即可,但如果这个类型中包含其他自定义类型的list你就会发现传递过去的尽然是空的,下面我们来看一个例子

public class MainActivity extends AppCompatActivity {
private List<A> mlist;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    init();
    findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent intent = new Intent();
            intent.setClass(MainActivity.this,SecondActivity.class);
            Bundle bundle = new Bundle();
            bundle.putParcelableArrayList("key", (ArrayList<? extends Parcelable>) mlist);
            intent.putExtras(bundle);
            startActivity(intent);
        }
    });
}

private void init(){
    mlist = new ArrayList<>();
    for(int j = 0; j < 3;j++){
       A a = new A();
        a.content1 = "111";
        List<String> list1 = new ArrayList<>();
        list1.add("1");
        list1.add("2");
        a.mlist1 = list1;
        List<B> list2 = new ArrayList<>();
        for(int i = 0;i < 2;i++){
            B b = new B();
            b.content2 = i +"";
            list2.add(b);
        }
        a.mlist2 = list2;
        mlist.add(a);
    }
}

}
在看自定义类:

public class A implements Parcelable{
public String content1;
public List<String> mlist1;
public List<B> mlist2;
public A(){

}

protected A(Parcel in) {
    content1 = in.readString();
    mlist1 = in.createStringArrayList();
}

public static final Creator<A> CREATOR = new Creator<A>() {
    @Override
    public A createFromParcel(Parcel in) {
        return new A(in);
    }

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

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

@Override
public void writeToParcel(Parcel parcel, int i) {
    parcel.writeString(content1);
    parcel.writeStringList(mlist1);
}


public class B {
    public String content2;
}

下个界面只是简单的获取传输的数据,就不附代码了。
我们去跟踪代码的时候发现:
关于使用putParcelableArrayList遇到的问题
既然为null了,数据没有传递过去,别慌,返回看代码,我们在类型A中发现关于使用putParcelableArrayList遇到的问题
我们的mlist2并没有放进去,应该是这里出现问题导致的下个页面收到的list数据为null,此时我们只需要加入: mlist2 = in.readArrayList(B.class.getClassLoader());同时自定义类型B也一定要继承Parcelable接口,不然会报错。

最后附上完全的2个类型代码以及传输后的数据截图:

public class A implements Parcelable{
public String content1;
public List<String> mlist1;
public List<B> mlist2;
public A(){

}

protected A(Parcel in) {
    content1 = in.readString();
    mlist1 = in.createStringArrayList();
    mlist2 = in.readArrayList(B.class.getClassLoader());
}

public static final Creator<A> CREATOR = new Creator<A>() {
    @Override
    public A createFromParcel(Parcel in) {
        return new A(in);
    }

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

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

@Override
public void writeToParcel(Parcel parcel, int i) {
    parcel.writeString(content1);
    parcel.writeStringList(mlist1);
    parcel.writeList(mlist2);
}

}

public class B implements Parcelable{
public String content2;

public B(){

}


protected B(Parcel in) {
    content2 = in.readString();
}

public static final Creator<B> CREATOR = new Creator<B>() {
    @Override
    public B createFromParcel(Parcel in) {
        return new B(in);
    }

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

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

@Override
public void writeToParcel(Parcel parcel, int i) {
    parcel.writeString(content2);
}

}
关于使用putParcelableArrayList遇到的问题
写的有点啰嗦了,是希望自己回过头或者大家看的时候知道问题出在哪里