如何在Android中使用Intent将对象的ArrayList从一个传递给另一个活动?
我在我的onClick()
方法中的代码如下
List<Question> mQuestionsList = QuestionBank.getQuestions();
现在我有意图在这行后面,如下所示:
Intent resultIntent = new Intent(this, ResultActivity.class); resultIntent.putParcelableArrayListExtra("QuestionsExtra", (ArrayList<? extends Parcelable>) mQuestionsList); startActivity(resultIntent);
我不知道如何将这个问题列表从意图从一个活动传递给另一个活动我的问题类
public class Question { private int[] operands; private int[] choices; private int userAnswerIndex; public Question(int[] operands, int[] choices) { this.operands = operands; this.choices = choices; this.userAnswerIndex = -1; } public int[] getChoices() { return choices; } public void setChoices(int[] choices) { this.choices = choices; } public int[] getOperands() { return operands; } public void setOperands(int[] operands) { this.operands = operands; } public int getUserAnswerIndex() { return userAnswerIndex; } public void setUserAnswerIndex(int userAnswerIndex) { this.userAnswerIndex = userAnswerIndex; } public int getAnswer() { int answer = 0; for (int operand : operands) { answer += operand; } return answer; } public boolean isCorrect() { return getAnswer() == choices[this.userAnswerIndex]; } public boolean hasAnswered() { return userAnswerIndex != -1; } @Override public String toString() { StringBuilder builder = new StringBuilder(); // Question builder.append("Question: "); for(int operand : operands) { builder.append(String.format("%d ", operand)); } builder.append(System.getProperty("line.separator")); // Choices int answer = getAnswer(); for (int choice : choices) { if (choice == answer) { builder.append(String.format("%d (A) ", choice)); } else { builder.append(String.format("%d ", choice)); } } return builder.toString(); } }
活动之间:为我工作
ArrayList<Object> object = new ArrayList<Object>(); Intent intent = new Intent(Current.class, Transfer.class); Bundle args = new Bundle(); args.putSerializable("ARRAYLIST",(Serializable)object); intent.putExtra("BUNDLE",args); startActivity(intent);
在Transfer.class中
Intent intent = getIntent(); Bundle args = intent.getBundleExtra("BUNDLE"); ArrayList<Object> object = (ArrayList<Object>) args.getSerializable("ARRAYLIST");
希望这个帮助的人。
使用Parcelable在Activity之间传递数据
这通常在您创buildDataModel时起作用
假设我们有一个types的json
{ "bird": [{ "id": 1, "name": "Chicken" }, { "id": 2, "name": "Eagle" }] }
这里的鸟是一个List,它包含两个元素
我们将使用jsonschema2pojo创build模型
现在我们有模型类名称BirdModel和Bird BirdModel由Bird和Bird列表组成,其中包含名称和ID
去鸟类添加界面“ 实现Parcelable ”
用Alt + Enter在android studio中添加实现方法
注意:会出现一个对话框,显示Add implements方法按下Enter键
通过按Alt + Enter添加Parcelable实现
注意:将出现一个对话框,指出Add Parcelable的实现并再次input
现在把它传递给意图。
List<Bird> birds = birdModel.getBird(); Intent intent = new Intent(Current.this, Transfer.class); Bundle bundle = new Bundle(); bundle.putParcelableArrayList("Birds", birds); intent.putExtras(bundle); startActivity(intent);
并在转移活动onCreate
List<Bird> challenge = this.getIntent().getExtras().getParcelableArrayList("Birds");
谢谢
如果有任何问题,请告诉我。
它运作良好,
public class Question implements Serializable { private int[] operands; private int[] choices; private int userAnswerIndex; public Question(int[] operands, int[] choices) { this.operands = operands; this.choices = choices; this.userAnswerIndex = -1; } public int[] getChoices() { return choices; } public void setChoices(int[] choices) { this.choices = choices; } public int[] getOperands() { return operands; } public void setOperands(int[] operands) { this.operands = operands; } public int getUserAnswerIndex() { return userAnswerIndex; } public void setUserAnswerIndex(int userAnswerIndex) { this.userAnswerIndex = userAnswerIndex; } public int getAnswer() { int answer = 0; for (int operand : operands) { answer += operand; } return answer; } public boolean isCorrect() { return getAnswer() == choices[this.userAnswerIndex]; } public boolean hasAnswered() { return userAnswerIndex != -1; } @Override public String toString() { StringBuilder builder = new StringBuilder(); // Question builder.append("Question: "); for(int operand : operands) { builder.append(String.format("%d ", operand)); } builder.append(System.getProperty("line.separator")); // Choices int answer = getAnswer(); for (int choice : choices) { if (choice == answer) { builder.append(String.format("%d (A) ", choice)); } else { builder.append(String.format("%d ", choice)); } } return builder.toString(); } }
在你的源活动中,使用这个:
List<Question> mQuestionList = new ArrayList<Question>; mQuestionsList = QuestionBank.getQuestions(); mQuestionList.add(new Question(ops1, choices1)); Intent intent = new Intent(SourceActivity.this, TargetActivity.class); intent.putExtra("QuestionListExtra", ArrayList<Question>mQuestionList);
在你的目标活动中,使用这个:
List<Question> questions = new ArrayList<Question>(); questions = (ArrayList<Question>)getIntent().getSerializableExtra("QuestionListExtra");
脚步:
-
实现你的对象类到可序列化
public class Question implements Serializable`
-
把它放在你的源代码活动中
ArrayList<Question> mQuestionList = new ArrayList<Question>; mQuestionsList = QuestionBank.getQuestions(); mQuestionList.add(new Question(ops1, choices1)); Intent intent = new Intent(SourceActivity.this, TargetActivity.class); intent.putExtra("QuestionListExtra", mQuestionList);
-
把它放在你的目标活动中
ArrayList<Question> questions = new ArrayList<Question>(); questions = (ArrayList<Questions>) getIntent().getSerializableExtra("QuestionListExtra");
通过Parcelable传递你的对象。 这里是一个很好的教程 ,让你开始。
第一个问题应该像这样实现Parcelable并添加这些行:
public class Question implements Parcelable{ public Question(Parcel in) { // put your data using = in.readString(); this.operands = in.readString();; this.choices = in.readString();; this.userAnswerIndex = in.readString();; } public Question() { } @Override public int describeContents() { // TODO Auto-generated method stub return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(operands); dest.writeString(choices); dest.writeString(userAnswerIndex); } public static final Parcelable.Creator<Question> CREATOR = new Parcelable.Creator<Question>() { @Override public Question[] newArray(int size) { return new Question[size]; } @Override public Question createFromParcel(Parcel source) { return new Question(source); } }; }
然后像这样传递你的数据:
Question question = new Question(); // put your data Intent resultIntent = new Intent(this, ResultActivity.class); resultIntent.putExtra("QuestionsExtra", question); startActivity(resultIntent);
并得到你的数据是这样的:
Question question = new Question(); Bundle extras = getIntent().getExtras(); if(extras != null){ question = extras.getParcelable("QuestionsExtra"); }
这会做!
如果你的类只包含原语 , Serializeble或String字段,你可以实现他的Serializable 。 ArrayList是实现Serializable ,这就是为什么你可以把它像Bundle.putSerializable(键,值) ,并将其发送到另一个活动 。 恕我直言,Parcelable – 这是非常长的路。
我在这种情况下做了两件事情之一
-
为我的对象实现一个序列化/反序列化系统,并将它们作为string传递(通常以JSON格式,但是可以按照您的喜好以任何方式将其序列化)
-
实现一个活动以外的容器,以便我所有的活动都可以读写这个容器。 你可以使这个容器是静态的,或者使用某种dependency injection来检索每个活动中的相同实例。
Parcelable工作得很好,但是我总是发现它是一个看起来丑陋的模式,如果你在模型之外编写你自己的序列化代码,并没有增加任何不存在的值。
如果你的Question
实现了Parcelable
你的意图创build似乎是正确的。
在下一个活动中,您可以检索您的问题列表,如下所示:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if(getIntent() != null && getIntent().hasExtra("QuestionsExtra")) { List<Question> mQuestionsList = getIntent().getParcelableArrayListExtra("QuestionsExtra"); } }
您可以通过使用捆绑意图将arrays列表从一个活动传递到另一个活动。 使用下面的代码这是传递数组列表的最短和最合适的方法
bundle.putStringArrayList( “关键字”,数组列表);
除了Serializable之外,您还必须实现Parcelable接口,并且必须在Constructor中使用Parcel参数在您的Questions类中添加writeToParcel方法。 否则应用程序将崩溃。
使用下面的代码;
private ArrayList<AssignListPojo.AssignListObj> mDataset;
使你的模型类实现Serializable
并使用下面的代码传递你的ArrayList;
intent.putExtra("StringKey",mDataset);
并使用下面的代码在另一个活动中获取此数组列表;
ArrayList<String> myList = (ArrayList<String>) getIntent().getSerializableExtra("StringKey");
我有完全相同的问题,虽然仍然在讨论Parcelable
,但我发现静态variables对于这个任务并不是一个坏主意。
你可以简单地创build一个
public static ArrayList<Parliament> myObjects = ..
并通过MyRefActivity.myObjects
从别处使用它
我不确定公共静态variables在具有活动的应用程序环境中所暗示的含义。 如果您对此方法或性能方面也有疑问,请参阅:
- 活动之间共享数据的最佳方式是什么?
- 在Android中使用静态variables
干杯。