Comment passer ArrayList D'objets d'une activité à une autre en utilisant intention dans android?

j'ai le texte suivant dans le code dans mon onClick() méthode

 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 de passer d'une activité à une autre activité Ma Question classe

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

      }
18
demandé sur Charles 2012-11-28 13:34:00

15 réponses

entre les activités: ça a marché 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 le Transfert.classe

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 séparables pour transmettre des données entre les activités

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 bird est une Liste et il contient deux éléments

nous allons créer les modèles en utilisant jsonschema2pojo

nous avons maintenant le nom de classe du modèle BirdModel et Bird BirdModel composé de la Liste des Oiseaux et d'Oiseaux, qui contient le nom et l'id

Aller à la classe des oiseaux et l'interface d'ajout "implémente Parcelable"

ajouter implemets méthode dans android studio par Alt+Enter

Note: une boîte de dialogue s'affichera indiquant la méthode Add implements appuyez sur Entrée

l'ajout D'une implémentation séparable en appuyant sur la touche Alt + Entrez

Note: une boîte de dialogue apparaîtra disant ajouter une implémentation Morcelable et Entrez de nouveau

Maintenant passer à 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--6-->

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

Merci

s'il y a un problème, merci de me le faire savoir.

41
répondu Somir Saikia 2016-02-20 05:13:50

Cela fonctionne 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
répondu RajeshVijayakumar 2012-11-29 00:13:10

Mesures:

  1. Implémente votre classe d'objets serialisable

    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");
    
16
répondu Javier Armero Ciudad 2017-08-14 14:04:33

passez votre objet via Morcelable. Et voici un bon tuto pour obtenir vous avez commencé.

Première Question met en œuvre Parcelable comme cela et ajouter ces lignes:

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 passez 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 obtenir vos données comme ceci:

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

Cela va faire!

4
répondu Lazy Ninja 2012-11-28 09:59:55

votre classe bean ou pojo devrait implémenter l'interface séparable

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

}

Envisager un scénario que vous souhaitez envoyer la liste de tableaux de beanclass type de Activity1 à Activity2 Utilisez le code suivant

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

je pense que cette base pour comprendre le concept

3
répondu krishna murthy 2018-02-06 13:05:48

Si votre classe Question ne contient que des primitives, Serializeble ou Chaîne champs vous pouvez l'implémenter Serialisable. ArrayList est de mettre en œuvre Serialisable, c'est pourquoi vous pouvez le mettre comme Bundle.putSerializable(clé, valeur) et l'envoyer à un autre Activité. IMHO, séparable - c'est très loin.

2
répondu nfirex 2012-11-28 09:47:27

je faire une de deux choses dans ce scénario

  1. implémenter un système serialize / deserialize pour mes objets et les passer sous forme de chaînes (au format JSON habituellement, mais vous pouvez les sérialiser de n'importe quelle façon que vous voulez)

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

séparable fonctionne très bien, mais j'ai toujours trouvé que c'était un motif laid et n'ajoute pas vraiment de valeur qui n'est pas là si vous écrivez votre propre code de sérialisation en dehors du modèle.

2
répondu Rich 2013-12-05 04:18:06

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

dans la prochaine activité, vous pouvez récupérer votre liste de questions comme ceci:

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

    if(getIntent() != null && getIntent().hasExtra("QuestionsExtra")) {
        List<Question> mQuestionsList = getIntent().getParcelableArrayListExtra("QuestionsExtra");
    }
}
1
répondu fiddler 2012-11-28 09:39:13

vous pouvez passer l'arraylist d'une activité à l'autre en utilisant bundle with intent. Utilisez le code ci-dessous C'est le plus court et le plus adapté pour passer, arraylist

bundle.putsstringarraylist ("keyword", arraylist);

1
répondu DeepakAndroid 2012-11-28 10:13:17

vous devez également implémenter L'interface séparable et ajouter la méthode writeToParcel à votre classe de Questions avec argument de parcelle dans le constructeur en plus de Serialisable. sinon app va s'écraser.

1
répondu Punit Shah 2015-01-20 01:07:12

Votre liste de tableaux:

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

Ecrivez ce code d'où vous voulez l'intention:

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

Dans La Prochaine Activité:

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

Écrire ce code dans onCreate:

myArray =(ArrayList<String>)getIntent().getSerializableExtra("name");
1
répondu Wajid khan 2018-01-31 08:11:09

vous pouvez utiliser un séparable pour le passage d'objet qui est plus efficace que le sérialisable .

veuillez référez-vous le lien que je partage contient échantillon complet. cliquez sur Télécharger ParcelableSample.zip

0
répondu Gyan Swaroop Awasthi 2018-06-07 13:06:43
//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
répondu Kishore Reddy 2018-08-29 10:35:31

Simple que cela !! a travaillé pour moi

à Partir 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
répondu stack subash 2018-09-05 02:17:57

j'avais exactement la même question et tout en continuant à m'embêter avec le Parcelable, j'ai trouvé que l' variables statiques ne sont pas une mauvaise idée pour la tâche.

Vous pouvez simplement créer un

public static ArrayList<Parliament> myObjects = .. 

et l'utiliser d'ailleurs via MyRefActivity.myObjects

Je n'étais pas sûr de ce que les variables publiques statiques impliquent dans le contexte d'une application avec des activités. Si vous avez également des doutes à ce sujet ou sur les aspects de performance de cette approche, référez-vous à:

Cheers.

-2
répondu Orkun Ozen 2017-05-23 11:47:06