将列表从一个活动传递到另一个活动
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>
。
您可以调用Intent
的putExtra (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 更有效
【讨论】:
以上是关于将列表从一个活动传递到另一个活动的主要内容,如果未能解决你的问题,请参考以下文章
当我单击列表视图的操作项时,将文本从列表视图传递到另一个活动