我将尝试尽可能地解释,我正在开发一个Android应用程序,在Java类中我有一些数据(对象)列表,我想将此列表转移到另一个Java类(Activity),按顺序在此课程中使用此列表的数据。
这是我的代码:
public class DocumentariesCategoriesActivity extends Activity implements AdapterView.OnItemClickListener{
private List<VideoEntity> videoSearchResult;
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Log.d(TAG, "onItemClick(AdapterView<?> , View, int, long) - Ini");
new Thread(new Runnable() {
@Override
public void run (){
YouTubeConnector youtube = new YouTubeConnector(DocumentariesCategoriesActivity.this);
videoSearchResult = youtube.search();
handler.post(new Runnable() {
@Override
public void run() {
Intent intent = new Intent(DocumentariesCategoriesActivity.this, DocumentariesCatalogActivity.class).putExtra("videos", (Parcelable) videoSearchResult);
startActivity(intent);
}
});
}
}).start();
}
正如您在代码中看到的,我要将列表传输到的活动是DocumentariesCatalogActivity
。我不知道这是否是传递它的正确方法,如果是,那么我的问题是如何捕获VideoEntity
类中的DocumentariesCatalogActivity
列表?
我看到了一些类似的问题,但只有String类型。
答案 0 :(得分:2)
我可以解决它在我的对象类VideoEntity中实现Parcelable接口:
public class VideoEntity implements Parcelable{
private String title;
private String description;
private String thumbnailURL;
private String id;
public VideoEntity() {
}
public VideoEntity(Parcel in) {
title = in.readString();
description = in.readString();
thumbnailURL = in.readString();
id = in.readString();
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getThumbnailURL() {
return thumbnailURL;
}
public void setThumbnailURL(String thumbnail) {
this.thumbnailURL = thumbnail;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(id);
dest.writeString(title);
dest.writeString(description);
dest.writeString(thumbnailURL);
}
public static final Creator<VideoEntity> CREATOR = new Creator<VideoEntity>() {
@Override
public VideoEntity createFromParcel(Parcel in) {
return new VideoEntity(in);
}
@Override
public VideoEntity[] newArray(int size) {
return new VideoEntity[size];
}
};
}
在我要转移列表的活动中,我改变了这个:
Intent intent = new Intent(DocumentariesCategoriesActivity.this, DocumentariesCatalogActivity.class).putExtra("videos", (Parcelable) videoSearchResult);
startActivity(intent);
到此:
Intent intent = new Intent(getApplicationContext(), VideosCatalogActivity.class);
intent.putExtra("com.myapp.entities.VideoEntity" , videoSearchResult);
startActivity(intent);
最后检索我用过的其他活动中的列表:
Bundle bundle = getIntent().getExtras();
videosList = bundle.getParcelableArrayList("com.myapp.entities.VideoEntity" );
答案 1 :(得分:-1)
试试这个,将对象转换为byte [],正常传递意图。然后将其转换回对象。
从对象转换为字节数组
// toByteArray and toObject are taken from: http://scr4tchp4d.blogspot.co.uk/2008/07/object-to-byte-array-and-byte-array-to.html
public static byte[] toByteArray(Object obj) throws IOException {
byte[] bytes = null;
ByteArrayOutputStream bos = null;
ObjectOutputStream oos = null;
try {
bos = new ByteArrayOutputStream();
oos = new ObjectOutputStream(bos);
oos.writeObject(obj);
oos.flush();
bytes = bos.toByteArray();
} finally {
if (oos != null) {
oos.close();
}
if (bos != null) {
bos.close();
}
}
return bytes;
}
使用它来创建字节数组以放入意图。
Intent intent = new Intent(DocumentariesCategoriesActivity.this, DocumentariesCatalogActivity.class)
intent.putExtra("videos", toByteArray(videoSearchResult));
startActivity(intent);
然后在下一个Activity中,使用此方法。
public static Object toObject(byte[] bytes) throws IOException, ClassNotFoundException {
Object obj = null;
ByteArrayInputStream bis = null;
ObjectInputStream ois = null;
try {
bis = new ByteArrayInputStream(bytes);
ois = new ObjectInputStream(bis);
obj = ois.readObject();
} finally {
if (bis != null) {
bis.close();
}
if (ois != null) {
ois.close();
}
}
return obj;
}
通过强制转换将字节数组转换回对象。
Intent intent = getIntent();
List<VideoEntity> videoSearchResult = (List<VideoEntity>) intent.getByteArrayExtra("videos");
你可以将两个转换函数放入自己的类中来整理它。但要确保它先行。