Как передать ArrayList объектов из одного действия в другое с помощью Intent в android?
у меня есть следующее в коде в моем onClick()
метод as
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();
}
}
15 ответов
между действиями: работал на меня
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);
в передаче.класс!--6-->
Intent intent = getIntent();
Bundle args = intent.getBundleExtra("BUNDLE");
ArrayList<Object> object = (ArrayList<Object>) args.getSerializable("ARRAYLIST");
надеюсь, что это поможет кто-то.
использование Parcelable для передачи данных между действиями
это обычно работает, когда вы создали DataModel
например, предположим, что у нас есть json типа
{
"bird": [{
"id": 1,
"name": "Chicken"
}, {
"id": 2,
"name": "Eagle"
}]
}
вот птица список, и он содержит два элемента так
мы создадим модели используя jsonschema2pojo
теперь у нас есть название класса модели BirdModel и Bird BirdModel состоят из списка птиц и птица содержит имя и id
перейдите в класс bird и добавьте интерфейс"реализует Parcelable"
добавить метод implemets в Android studio с помощью Alt + Enter
Примечание: появится диалоговое окно с надписью Add implements method нажмите Enter
добавить Parcelable реализацию, нажав Alt + Enter
Примечание: появится диалоговое окно с надписью добавить реализацию Parcelable и войди снова
теперь, чтобы передать его намерению.
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");
}
это подойдет!
ваш класс bean или pojo должен реализовывать интерфейс parcelable
например:
public class BeanClass implements Parcelable{
String name;
int age;
String sex;
public BeanClass(String name, int age, String sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
public static final Creator<BeanClass> CREATOR = new Creator<BeanClass>() {
@Override
public BeanClass createFromParcel(Parcel in) {
return new BeanClass(in);
}
@Override
public BeanClass[] newArray(int size) {
return new BeanClass[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeInt(age);
dest.writeString(sex);
}
}
рассмотрим сценарий, который вы хотите отправить arraylist типа beanclass из Activity1 в Activity2 Используйте следующий код
Activity1:
ArrayList<BeanClass> list=new ArrayList<BeanClass>();
private ArrayList<BeanClass> getList() {
for(int i=0;i<5;i++) {
list.add(new BeanClass("xyz", 25, "M"));
}
return list;
}
private void gotoNextActivity() {
Intent intent=new Intent(this,Activity2.class);
/* Bundle args = new Bundle();
args.putSerializable("ARRAYLIST",(Serializable)list);
intent.putExtra("BUNDLE",args);*/
Bundle bundle = new Bundle();
bundle.putParcelableArrayList("StudentDetails", list);
intent.putExtras(bundle);
startActivity(intent);
}
действие activity2:
ArrayList<BeanClass> listFromActivity1=new ArrayList<>();
listFromActivity1=this.getIntent().getExtras().getParcelableArrayList("StudentDetails");
if (listFromActivity1 != null) {
Log.d("listis",""+listFromActivity1.toString());
}
Я думаю, что это основное понимать концепцию
Если ваш класс вопрос содержит только примитивы, Serializeble или строка поля вы можете реализовать его сериализуемые. ArrayList-это реализация сериализуемые, вот почему вы можете поставить его как пакета.putSerializable(ключ, значение) и отправить его на другой активность. ИМХО, Parcelable - это очень долгий путь.
Я делаю одну из двух вещей в этом случае
реализуйте систему сериализации / десериализации для моих объектов и передайте их как строки (обычно в формате JSON, но вы можете сериализовать их любым способом)
реализуйте контейнер, который живет вне действий, чтобы все мои действия могли читать и писать в этот контейнер. Вы можете сделать этот контейнер статическим или использовать какую-то инъекцию зависимостей для извлечения того же экземпляра в каждом действии.
Parcelable работает просто отлично, но я всегда находил, что это уродливый шаблон и на самом деле не добавляет никакого значения, которого нет, если вы пишете свой собственный код сериализации вне модели.
ваше намерение создание кажется правильным, если ваш Question
осуществляет Parcelable
.
в следующем действии вы можете получить свой список вопросов, как это:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if(getIntent() != null && getIntent().hasExtra("QuestionsExtra")) {
List<Question> mQuestionsList = getIntent().getParcelableArrayListExtra("QuestionsExtra");
}
}
вы можете передать arraylist из одного действия в другое, используя bundle с намерением. Используйте код ниже Это самый короткий и наиболее подходящий способ пройти arraylist
пакета.putStringArrayList ("ключевое слово", arraylist);
вам также необходимо реализовать интерфейс Parcelable и добавить метод writeToParcel в класс Questions с аргументом Parcel в конструкторе в дополнение к Serializable. в противном случае приложение рухнет.
ваш arrayList:
ArrayList<String> yourArray = new ArrayList<>();
напишите этот код, откуда вы хотите намерение:
Intent newIntent = new Intent(this, NextActivity.class);
newIntent.putExtra("name",yourArray);
startActivity(newIntent);
В Следующем Действии:
ArrayList<String> myArray = new ArrayList<>();
напишите этот код в onCreate:
myArray =(ArrayList<String>)getIntent().getSerializableExtra("name");
вы можете использовать parcelable для передачи объекта, который более эффективен, чем сериализуемый .
пожалуйста, обратитесь к ссылке, которую я разделяю, содержит полный образец parcelable. нажмите Загрузить ParcelableSample.zip
//arraylist/Pojo you can Pass using bundle like this
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
Bundle args = new Bundle();
args.putSerializable("imageSliders",(Serializable)allStoriesPojo.getImageSliderPojos());
intent.putExtra("BUNDLE",args);
startActivity(intent);
Get SecondActivity like this
Intent intent = getIntent();
Bundle args = intent.getBundleExtra("BUNDLE");
String filter = bundle.getString("imageSliders");
//Happy coding
просто !! работал на меня
активность
Intent intent = new Intent(Viewhirings.this, Informaall.class);
intent.putStringArrayListExtra("list",nselectedfromadapter);
startActivity(intent);
активность
Bundle bundle = getIntent().getExtras();
nselectedfromadapter= bundle.getStringArrayList("list");
у меня был тот же самый вопрос и в то же время все еще беспокоился с Parcelable
, я узнал, что статические переменные не такая уж плохая идея для задачи.
вы можете просто создать
public static ArrayList<Parliament> myObjects = ..
и использовать его из другого места через MyRefActivity.myObjects
Я не был уверен в том, что подразумевают общедоступные статические переменные в контексте приложения с действиями. Если у вас также есть сомнения по поводу этого или по аспектам производительности этого подхода, обратитесь к кому:
- каков наилучший способ обмена данными между мероприятиями?
- использование статических переменных в Android
Ура.