Как передать 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");

действия:

  1. реализует ваш класс объектов в сериализуемые

    public class Question implements Serializable`
    
  2. положите это в свой Источник Активности

    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);
    
  3. положите это в свой Цель Деятельности

     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 - это очень долгий путь.


Я делаю одну из двух вещей в этом случае

  1. реализуйте систему сериализации / десериализации для моих объектов и передайте их как строки (обычно в формате JSON, но вы можете сериализовать их любым способом)

  2. реализуйте контейнер, который живет вне действий, чтобы все мои действия могли читать и писать в этот контейнер. Вы можете сделать этот контейнер статическим или использовать какую-то инъекцию зависимостей для извлечения того же экземпляра в каждом действии.

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

Я не был уверен в том, что подразумевают общедоступные статические переменные в контексте приложения с действиями. Если у вас также есть сомнения по поводу этого или по аспектам производительности этого подхода, обратитесь к кому:

Ура.