web-dev-qa-db-de.com

Wie kann ich die ArrayList of Objects mit der Intent in Android von einer zu einer anderen Aktivität übergeben?

Ich habe den folgenden Code in meiner onClick()-Methode als 

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

Nun habe ich die Absicht nach dieser Zeile wie folgt:

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

Ich weiß nicht, wie ich diese Fragenlisten in der Absicht von einer Aktivität an eine andere Aktivität übergeben kannMeine Fragenklasse

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

Es läuft gut,

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

Verwenden Sie in Ihrer Quellenaktivität Folgendes:

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

Verwenden Sie in Ihrer Zielaktivität Folgendes:

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

Zwischen Aktivität: Für mich gearbeitet

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

In der Transfer.class

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

Hoffe, diese Hilfe ist jemand.

Verwenden von Parcelable zum Übertragen von Daten zwischen Aktivität

Dies funktioniert normalerweise, wenn Sie DataModel erstellt haben

z.B. Angenommen, wir haben einen Json-Typ

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

Hier ist Vogel eine Liste und er enthält zwei Elemente 

wir erstellen die Modelle mit jsonschema2pojo

Jetzt haben wir die Modellklasse Name BirdModel und Bird BirdModel bestehen aus List of Bird Und Bird enthält Name und ID

Gehen Sie zur Vogelklasse und fügen Sie die Schnittstelle "implements Parcelable" hinzu.

fügen Sie die Implemets-Methode in Android Studio von Alt + Enter hinzu 

Hinweis: Ein Dialogfeld wird angezeigt, in dem Sie die Methode zum Implementieren von Methoden drücken und die Eingabetaste drücken

Fügen Sie Parcelable-Implementierung hinzu, indem Sie die Tastenkombination Alt + Eingabetaste drücken

Hinweis: Es erscheint ein Dialogfeld mit der Meldung Parcelable-Implementierung hinzufügen und erneut eingeben

Nun, um es der Absicht zu übergeben.

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

Und bei Übertragungsaktivität onCreate

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

Vielen Dank 

Wenn es ein Problem gibt, lass es mich wissen.

47
Somir Saikia

Schritte:

  1. Implementiert Ihre Objektklasse in serialisierbar

    public class Question implements Serializable`
    
  2. Fügen Sie dies in Ihre Source-Aktivität .__ ein.

    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. Setzen Sie dies in Ihre Target Activity

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

Übergeben Sie Ihr Objekt über Parcelable . Und hier ist ein gutes Tutorial , um den Einstieg zu erleichtern.
Erste Frage sollte Parcelable so implementieren und die folgenden Zeilen hinzufügen:

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

}

Dann geben Sie Ihre Daten so weiter:

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

Und bekomme deine Daten so:

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

Das wird es tun!

4
Lazy Ninja

Ihre Bean- oder Pojo-Klasse sollte implements parcelable interface sein.

Zum Beispiel:

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

Stellen Sie sich ein Szenario vor, dass Sie die Variable arraylist vom Typ beanclass von Activity1 an Activity2 senden möchten.
Verwenden Sie den folgenden Code

Aktivität 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);
}

Aktivität2:

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

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

if (listFromActivity1 != null) {

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

Ich denke, das ist grundlegend, um das Konzept zu verstehen.

3
krishna murthy

In diesem Szenario mache ich zwei Dinge

  1. Implementieren Sie ein Serialisierungs-/Deserialisierungssystem für meine Objekte und übergeben Sie sie als Strings (normalerweise im JSON-Format, aber Sie können sie nach Belieben serialisieren).

  2. Implementieren Sie einen Container, der sich außerhalb der Aktivitäten befindet, damit alle meine Aktivitäten diesen Container lesen und beschreiben können. Sie können diesen Container als statisch festlegen oder eine Abhängigkeitspritze verwenden, um in jeder Aktivität dieselbe Instanz abzurufen.

Parcelable funktioniert prima, aber ich fand es immer hässlich und fügt nicht wirklich einen Wert hinzu, der nicht vorhanden ist, wenn Sie Ihren eigenen Serialisierungscode außerhalb des Modells schreiben.

2
Rich

Wenn Ihre Klasse Question nur Primitive, Serializeble oder String Felder enthält, können Sie ihn Serializable implementieren. ArrayList ist implementiert Serializable, deshalb können Sie es wie Bundle.putSerializable (Schlüssel, Wert) setzen und es an eine andere Activity . IMHO, Parcelable senden - es ist sehr weit .

2
nfirex

Ihre arrayList:

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

Schreiben Sie diesen Code an dem Ort, an dem Sie beabsichtigen möchten: 

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

In der nächsten Aktivität:

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

Schreiben Sie diesen Code in onCreate:

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

Sie können die Arrayliste von einer Aktivität an eine andere übergeben, indem Sie ein Bündel mit Intent .. verwenden. Verwenden Sie den folgenden Code .__ Dies ist der kürzeste und am besten geeignete Weg, um die Arrayliste zu übergeben

bundle.putStringArrayList ("Schlüsselwort", Arrayliste);

1
DeepakAndroid

Ihre Absichtserstellung scheint korrekt zu sein, wenn Ihre QuestionParcelable implementiert.

In der nächsten Übung können Sie Ihre Fragenliste wie folgt abrufen:

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

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

Sie müssen auch die Parcelable-Schnittstelle implementieren und zusätzlich zur Serializable-Klasse in Constructor der Klasse Questions mit Parcel die Methode writeToParcel hinzufügen. Andernfalls stürzt die App ab.

1
Punit Shah

Sie können parcelable für die Objektübergabe verwenden, was effizienter ist als Serializable.

Bitte verweisen Sie auf den Link, den ich teile, enthält vollständige paketversandfähige Probe. Klicken Sie auf ParcelableSample.Zip herunterladen

Um die Daten in kotlin zu setzen

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

Um die Daten zu erhalten

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

Greifen Sie jetzt auf die Arrayliste zu

0
Shaon

So einfach ist das !! arbeitete für mich

Von der Tätigkeit

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

        startActivity(intent);

TO Aktivität

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

Implementiert Parcelable und sendet Arraylist als putParcelableArrayListExtra und hol es dir bei der nächsten Aktivität getParcelableArrayListExtra

beispiel:

Implementiere parcelable in deiner benutzerdefinierten Klasse Alt + Enter) Implementiere die Methoden

public class Model implements Parcelable {

private String Id;

public Model() {

}

protected Model(Parcel in) {
    Id= in.readString();       
}

public static final Creator<Model> CREATOR = new Creator<Model>() {
    @Override
    public ModelcreateFromParcel(Parcel in) {
        return new Model(in);
    }

    @Override
    public Model[] newArray(int size) {
        return new Model[size];
    }
};

public String getId() {
    return Id;
}

public void setId(String Id) {
    this.Id = Id;
}


@Override
public int describeContents() {
    return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeString(Id);
}
}

--- (Klassenobjekt aus Aktivität 1 übergeben

 Intent intent = new Intent(Activity1.this, Activity2.class);
            intent.putParcelableArrayListExtra("model", modelArrayList);
            startActivity(intent);

Extra von Activity2 erhalten

if (getIntent().hasExtra("model")) {
        Intent intent = getIntent();
        cartArrayList = intent.getParcelableArrayListExtra("model");

    } 
0