将列表从一个活动传递到另一个活动

Posted

技术标签:

【中文标题】将列表从一个活动传递到另一个活动【英文标题】:Passing a List from one Activity to another 【发布时间】:2012-07-05 15:32:45 【问题描述】:

如何通过 Intent 的 putExtra 方法将 ArrayList 等集合从一个 Activity 传递到另一个集合?

谁能帮助我,因为我想将List<String> 从一个Activity 传递给另一个?

【问题讨论】:

发帖前请先搜索一下; ***.com/… Please See this Blog. This Can Help You 【参考方案1】:

如果E 类型是Serializable,您可以以同样的方式传递ArrayList<E>

您可以调用IntentputExtra (String name, Serializable value) 进行存储,调用getSerializableExtra (String name) 进行检索。

例子:

ArrayList<String> myList = new ArrayList<String>();
intent.putExtra("mylist", myList);

在另一个活动中:

ArrayList<String> myList = (ArrayList<String>) getIntent().getSerializableExtra("mylist");

请注意,序列化可能会导致性能问题:它需要时间,并且会分配大量对象(因此必须进行垃圾回收)。

【讨论】:

+1 提到 E 必须是可序列化的,其他人似乎忘记提及了。 值得一提的是,List 接口没有扩展Serializable,因此如果您的集合是由接口声明的,则必须先将其转换为特定的实现。 注:-intent.putExtra("mylist", (Serializable)myList);为我工作! @MindRoasterMir 不客气,不,它也适用于自定义类列表 @iamkdblue 你写的我也这么说,可能是我的评论表述不正确。我是说接受的 asnwer 不适用于自定义类 List,而且还提到自定义类必须实现 Serializable 否则它将无法工作。谢谢【参考方案2】:

首先你需要创建一个 Parcelable 对象类,看例子

public class Student implements Parcelable 

        int id;
        String name;

        public Student(int id, String name) 
            this.id = id;
            this.name = name;

        

        public int getId() 
            return id;
        

        public String getName() 
            return name;
        


        @Override
        public int describeContents() 
            // TODO Auto-generated method stub
            return 0;
        

        @Override
        public void writeToParcel(Parcel dest, int arg1) 
            // TODO Auto-generated method stub
            dest.writeInt(id);
            dest.writeString(name);
        

        public Student(Parcel in) 
            id = in.readInt();
            name = in.readString();
        

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

            public Student[] newArray(int size) 
                return new Student[size];
            
        ;
    

还有名单

ArrayList<Student> arraylist = new ArrayList<Student>();

来自调用活动的代码

Intent intent = new Intent(this, SecondActivity.class);
Bundle bundle = new Bundle();
bundle.putParcelableArrayList("mylist", arraylist);
intent.putExtras(bundle);       
this.startActivity(intent);

调用活动的代码

protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_second);   

    Bundle bundle = getIntent().getExtras();
    ArrayList<Student> arraylist = bundle.getParcelableArrayList("mylist");

【讨论】:

工作就像一个魅力,一个小时后我得到了这个,非常感谢哥们。 使用可序列化比这个更好,但它对某人有好处。 +1 @HarishReddy 你能解释一下为什么使用可序列化更好吗?我认为 Parcelable 在性能方面比可序列化更好。 因为它在订单基础上工作,因为值在writeToParcel 中给出。是否有任何机制可以根据密钥从Parcel 对象获取值?例如,如果在课堂上我们有多个字符串字段,那么我们如何才能知道我们从 Student(Parcel in) 中的 Parcel 得到哪个字符串。 @HarishReddy:使用 Serializable 可以实现更简单的实现,但使用 Parcelable 可以提供更好的性能。哪个更好取决于具体情况:如果 Serializable 在您的用例中提供的性能足够,那么您应该更喜欢更简单的方法。但是,如果在您的用例中使用 Serializable 太慢,您应该尝试使用 Parcelable。【参考方案3】:

使用putExtra 将值传递给意图。使用getSerializableExtra 方法检索数据 像这样

活动 A:

ArrayList<String> list = new ArrayList<String>();

intent.putExtra("arraylist", list);
startActivity(intent);

活动 B:

ArrayList<String> list = getIntent().getSerializableExtra("arraylist");

【讨论】:

嗨 RajaReddy,我将数组列表 A 活动传递给 B 活动。 B 活动我更改了一个值并返回到 A 活动值不变。请帮帮我 返回 B 活动时,您必须将数据从 B 传递到 A.. 或将该数组设为全局数组并从 B 活动更新。 就我而言,我可以选择参加 C 活动。在那种情况下,我如何更新数组列表? 然后在应用程序类中将其设置为全局...并在您想使用的任何地方更新和使用 感谢您的提示。如果可能的话,给我你的邮件ID,我会通过电子邮件提出疑问。【参考方案4】:

我尝试了所有建议的技术,但都没有奏效并阻止我的应用程序运行,然后我终于成功了。这就是我是如何做到的...... 在主要活动中,我这样做了:

            List<String> myList...;
            Intent intent = new Intent...;
            Bundle b=new Bundle();
            b.putStringArrayList("KEY",(ArrayList<String>)myList);            
            intent_deviceList.putExtras(b);
            ....startActivity(intent);

在新的Activity中获取数据:

    List<String> myList...
    Bundle b = getIntent().getExtras();
    if (b != null) 
        myList = bundle.getStringArrayList("KEY");
    

我希望这会对某人有所帮助...

【讨论】:

【参考方案5】:

要将 ArrayList 从一个活动传递到另一个活动,应该包括

intent.putStringArrayListExtra(KEY, list); //where list is ArrayList which you want to pass

在开始活动之前。并在另一个活动中获取 ArrayList 包括

Bundle bundle = getIntent().getExtras();
        if (bundle != null) 
            temp = bundle.getStringArrayList(KEY); // declare temp as ArrayList
                

您将能够通过此传递 ArrayList。希望这对您有所帮助。

【讨论】:

【参考方案6】:

使用 ViewModel 比 Serializable 或 Parcelable 更有效

【讨论】:

以上是关于将列表从一个活动传递到另一个活动的主要内容,如果未能解决你的问题,请参考以下文章

如何将 LatLng 的数组列表从一个活动传递到另一个活动

无法通过intent将数组列表从一个活动传递到另一个活动

当我单击列表视图的操作项时,将文本从列表视图传递到另一个活动

如何将数据从 sqlite 数据库传递到另一个活动?

将数据从列表视图(从 Rest Api 生成)传递到另一个活动并将其保存到 SQLite 数据库中

如何将整数从一个活动传递到另一个活动?