关于使用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;
}
下个界面只是简单的获取传输的数据,就不附代码了。
我们去跟踪代码的时候发现:
既然为null了,数据没有传递过去,别慌,返回看代码,我们在类型A中发现
我们的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);
}
}
写的有点啰嗦了,是希望自己回过头或者大家看的时候知道问题出在哪里
上一篇: 抓包工具---fiddler
下一篇: 腾讯开源ncnn:Ubuntu下运行示例
推荐阅读
-
Three.js使用THREE.TextGeometry创建三维文本中文乱码的问题如何解决?
-
解决在Bootstrap模糊框中使用WebUploader的问题
-
Pytorch中使用tensorboard可视化不显示的问题
-
关于VS2005中C#代码用F12转到定义时,总是显示从元数据的问题
-
阿里云Centos6.X发邮件遇到的各种问题
-
jQuery中关于ScrollableGridPlugin.js(固定表头)插件的使用逐步解析
-
Java常见面试问题: equals()与hashCode()的使用
-
解决v-for中使用v-if或者v-bind:class失效的问题
-
vue中将html字符串转换成html后遇到的问题小结
-
解决pandas使用read_csv()读取文件遇到的问题