web-dev-qa-db-fra.com

Comment passer ArrayList of Objects d'une activité à une autre en utilisant Intent dans Android?

J'ai le code suivant dans ma méthode onClick() en tant que 

 List<Question> mQuestionsList = QuestionBank.getQuestions();

Maintenant, j'ai l'intention après cette ligne, comme suit:

  Intent resultIntent = new Intent(this, ResultActivity.class);
  resultIntent.putParcelableArrayListExtra("QuestionsExtra", (ArrayList<? extends Parcelable>) mQuestionsList);
  startActivity(resultIntent);

Je ne sais pas comment passer cette liste de questions dans l’intention d’une activité à une autre activité.

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();
       }

      }
20
RajeshVijayakumar

Ça marche bien,

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();
     }
  }

Dans votre activité source, utilisez ceci:

  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);

Dans votre activité cible, utilisez ceci:

  List<Question> questions = new ArrayList<Question>();
  questions = (ArrayList<Question>)getIntent().getSerializableExtra("QuestionListExtra");
18
RajeshVijayakumar

Entre activité: a travaillé pour moi

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);

Dans la classe de transfert

Intent intent = getIntent();
Bundle args = intent.getBundleExtra("BUNDLE");
ArrayList<Object> object = (ArrayList<Object>) args.getSerializable("ARRAYLIST");

J'espère que cette aide est quelqu'un.

Utilisation de Parcelable pour transmettre des données entre Activity

Cela fonctionne généralement lorsque vous avez créé DataModel.

par exemple. Supposons que nous ayons un JSON de type

{
    "bird": [{
        "id": 1,
        "name": "Chicken"
    }, {
        "id": 2,
        "name": "Eagle"
    }]
}

Ici, l’oiseau est une liste et il contient deux éléments 

nous allons créer les modèles avec jsonschema2pojo

Nous avons maintenant la classe de modèle Name BirdModel et Bird BirdModel se compose de List of Bird Et Bird contient name et id.

Allez dans la classe bird et ajoutez l'interface "implements Parcelable"

ajout de la méthode implemets dans le studio Android par Alt + Entrée 

Remarque: une boîte de dialogue apparaît pour indiquer que la méthode Ajouter est implémentée.

Ajouter l'implémentation Parcelable en appuyant sur les touches Alt + Entrée

Remarque: une boîte de dialogue indiquant Ajouter une implémentation parcelable.

Passons maintenant à l'intention.

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);

Et sur l'activité de transfert onCreate

List<Bird> challenge = this.getIntent().getExtras().getParcelableArrayList("Birds");

Merci 

S'il y a un problème s'il vous plaît faites le moi savoir.

47
Somir Saikia

Pas:

  1. Implémente votre classe d'objet sur serializable

    public class Question implements Serializable`
    
  2. Mettez ceci dans votre Activité source

    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. Mettez ceci dans votre Activité cible

     ArrayList<Question> questions = new ArrayList<Question>();
     questions = (ArrayList<Questions>) getIntent().getSerializableExtra("QuestionListExtra");
    
21

Passez votre objet via Parcelable . Et voici un bon tutoriel pour vous aider à démarrer.
La première question devrait implémenter Parcelable comme ceci et ajouter les lignes suivantes:

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);
        }
    };

}

Puis transmettez vos données comme ceci:

Question question = new Question();
// put your data
  Intent resultIntent = new Intent(this, ResultActivity.class);
  resultIntent.putExtra("QuestionsExtra", question);
  startActivity(resultIntent);

Et obtenez vos données comme ceci:

Question question = new Question();
Bundle extras = getIntent().getExtras();
if(extras != null){
    question = extras.getParcelable("QuestionsExtra");
}

Cela fera l'affaire!

4
Lazy Ninja

Votre classe de haricot ou de pojo devrait implements parcelable interface.

Par exemple:

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);
    }
}

Envisagez un scénario dans lequel vous souhaitez envoyer le type arraylist of beanclass de Activity1 à Activity2.
Utilisez le code suivant

Activité 1:

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);
}

Activité2:

ArrayList<BeanClass> listFromActivity1=new ArrayList<>();

listFromActivity1=this.getIntent().getExtras().getParcelableArrayList("StudentDetails");

if (listFromActivity1 != null) {

    Log.d("listis",""+listFromActivity1.toString());
}

Je pense que cette base pour comprendre le concept.

3
krishna murthy

Je fais l'une des deux choses dans ce scénario

  1. Implémentez un système de sérialisation/désérialisation de mes objets et transmettez-les sous forme de chaînes (au format JSON généralement, mais vous pouvez les sérialiser à votre guise)

  2. Implémentez un conteneur qui réside en dehors des activités afin que toutes mes activités puissent lire et écrire dans ce conteneur. Vous pouvez rendre ce conteneur statique ou utiliser un type d'injection de dépendance pour récupérer la même instance dans chaque activité.

Parcelable fonctionne très bien, mais j’ai toujours trouvé que c’était un motif moche qui n’ajoute aucune valeur qui n’existe pas si vous écrivez votre propre code de sérialisation en dehors du modèle.

2
Rich

Votre tableau de listes:

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

Écrivez ce code d'où vous voulez l'intention: 

Intent newIntent = new Intent(this, NextActivity.class);
newIntent.putExtra("name",yourArray);
startActivity(newIntent);

Dans l'activité suivante:

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

Écrivez ce code dans onCreate:

myArray =(ArrayList<String>)getIntent().getSerializableExtra("name");
1
Wajid khan

Vous pouvez passer l'arraylist d'une activité à une autre en utilisant bundle avec intent . Utilisez le code ci-dessous C'est le moyen le plus court et le plus approprié de passer arraylist

bundle.putStringArrayList ("mot clé", liste récapitulative);

1
DeepakAndroid

Votre création d’intention semble correcte si votre Question implémente Parcelable.

Dans l'activité suivante, vous pouvez récupérer votre liste de questions comme celle-ci:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if(getIntent() != null && getIntent().hasExtra("QuestionsExtra")) {
        List<Question> mQuestionsList = getIntent().getParcelableArrayListExtra("QuestionsExtra");
    }
}
1
fiddler

Vous devez également implémenter l'interface Parcelable et ajouter la méthode writeToParcel à votre classe Questions avec l'argument Parcel dans le constructeur en plus de Serializable. sinon l'application va planter.

1
Punit Shah

Vous pouvez utiliser le paramètre parcellaire pour le passage d’objet, ce qui est plus efficace que Serializable.

Veuillez vous référer au lien que je suis partage contient complet échantillon parcelable . Cliquez sur télécharger ParcelableSample.Zip

0

Pour définir les données dans kotlin

val offerIds = ArrayList<Offer>()
offerIds.add(Offer(1))
retrunIntent.putExtra(C.OFFER_IDS, offerIds)

Pour obtenir les données

 val offerIds = data.getSerializableExtra(C.OFFER_IDS) as ArrayList<Offer>?

Accédez maintenant à l'aryliste

0
Shaon

Aussi simple que cela !! a travaillé pour moi

De l'activité

        Intent intent = new Intent(Viewhirings.this, Informaall.class);
        intent.putStringArrayListExtra("list",nselectedfromadapter);

        startActivity(intent);

À l'activité

Bundle bundle = getIntent().getExtras();
    nselectedfromadapter= bundle.getStringArrayList("list");
0
stack subash
//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
0
Kishore Reddy