将ArrayList发送回父活动

5
我将尝试将一个ArrayList传回我的父Activity。
以下是简单的代码。
private ArrayList<Receipt> receipts = new ArrayList<Receipt>();


 Intent data = new Intent();
 data. // what to do here?
setResult(RESULT_OK, data); 

//************************************

这是基本的收据类

public class Receipt {


    public String referenceNo;
    public byte[]   image;
    public String comments;
    public Date   createdOn;
    public Date   updatedOn;

告诉我如何在我的intent中添加它,以及如何从父活动中检索它。
onActivityResult(final int requestCode, int resultCode, final Intent data)

1
你有检查过这个问题吗?-> http://stackoverflow.com/questions/5207510/android-passing-an-arraylist-back-to-parent-activity - Till Helge
类似这个?https://dev59.com/vW445IYBdhLWcg3w7ug0 - Shashank Kadne
4个回答

3
你可以使用 data.putExtra() / bundle.putSerializable() 将自定义对象放入 Bundle/Intent 中,但是你需要让你的类 Receipt 实现 Serializable 接口(只需在类名后添加 implements Serializable 即可实现这个简单类的序列化)。 然后,要读取它,可以使用 getSerializable() 方法。 注意:我不认为 Date 类是可序列化的,你可能需要将其替换为表示毫秒时间的 long 值(你可以使用 Date.getTime() 来获取)。 示例:
public class Receipt implements Serializable{
    public String referenceNo;
    public byte[]   image;
    public String comments;
    public long   createdOn;
    public long   updatedOn;
    //...
}

//Put the list in the intent
List<Receipt> list = ...
Intent data = new Intent();
data.putExtra("tag", list);

//Read the list from the intent:
list = (List<Receipt>) data.getSerializableExtra("tag");

0
你可以简单地传递你的ArrayList并且检索回来。
例如:
ArrayList<Receipt> list = new ArrayList<Receipt>();
intent intent = new Intent();
intent.putExtra("Hello", list);

但是请确保您的Receipt类实现了Serializable接口。

即:

public class Receipt implements Serializable

0
如果您的ArrayList将会很大,将其作为Intent数据传递可能会导致问题,例如应用程序无响应。这是因为操作系统需要花费时间来传递所有数据。
相反,您可以创建自己的Application类(您还需要在清单中注册它)。然后在此类中,您可以拥有:
class MyApplication extends Application {
...
public static Object mData;
}

然后,您可以执行MyApplication.mData = receiptsArrayList<Receipt> receipts = (ArrayList<Receipt>)(MyApplication.mData)

由于您的MyApplication对象将在整个应用程序生命周期中存在,因此此方法足够安全,并且在Android书籍(以及其他书籍)中推荐使用。


1
不建议使用此方法。 - Selvin
这是《Pro Android 3》书籍和其他地方提出的数据交换方法之一。但是,你说它不被推荐,有什么问题吗? 如果尝试通过意图数据传递非常大的数组,您将会看到ANR错误。 - Alexander Kulyakhtin
第一句:我看了这本书,但是我不能说它好。第二句:全局对象直到应用程序结束才会被释放。这就是为什么。第三句:这个问题更加复杂...为什么要使用意图传递大数组。如果确实有这样的需要,那么这意味着应用程序设计得很糟糕。在我看来,在这种情况下,我们应该使用ContentProvider,并且只传递Uri(Intent.getData()),之后ContentProvider通过此Uri“请求”,返回包含所有所需数据的游标。 - Selvin
可以明确地说mData = null,或者可以使用WeakReference。 ContentProvider似乎与此无关。 我喜欢这本书,尽管肯定存在各种不同的观点。 - Alexander Kulyakhtin

0
你的解决方案是使用Parcelable。请查看以下链接: link1, link2, link3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接