簡體   English   中英

將自定義對象的數組列表傳遞給另一個活動

[英]Passing arraylist of custom object to another activity

單擊單元格時,對象將添加到數組中。 該數組需要傳遞到另一個活動中。 為了進行測試,我通過了只有一個對象DoctorObject的數組。 然后在下一個活動中,我使用.getName()作為字符串獲取名稱,並將其顯示在吐司中。 但是,吐司是空的。

這是一些代碼片段

賓語:

public class DoctorObject implements Parcelable {

private List<Object> mChildrenList;

public DoctorObject(String name) {
    Docname = name;

}

public DoctorObject (Parcel in){
    this.DocPic = in.readInt();
    this.Docname= in.readString();
    this.Docspecialty = in.readString();
    this.DocLocation = in.readString();
}

String Docname = "";

public String getDocname() {
    return Docname;
}

public void setDocname(String docname) {
    Docname = docname;
}

public int getDocPic() {
    return DocPic;
}

public void setDocPic(int docPic) {
    DocPic = docPic;
}

public String getDocspecialty() {
    return Docspecialty;
}

public void setDocspecialty(String docspecialty) {
    Docspecialty = docspecialty;
}

public String getDocLocation() {
    return DocLocation;
}

public void setDocLocation(String docLocation) {
    DocLocation = docLocation;
}

int DocPic;
String Docspecialty = "";
String DocLocation = "";





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

@Override
public void writeToParcel(Parcel dest, int flags) {

}

public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
    public DoctorObject createFromParcel(Parcel in) {
        return new DoctorObject(in);
    }

    public DoctorObject[] newArray(int size) {
        return new DoctorObject[size];
    }
};

活動:

ArrayList<DoctorObject> selectedItems = new ArrayList<>();

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_create_my_team);

    context = this;


    /* Regular Expand listview

     */

    // get the listview
    expListView = (ExpandableListView) findViewById(R.id.newTeamListView);

    // preparing list data
    prepareListData();

    listAdapter = new ExpandableListAdapter(this,  listDataDoc, listDataChildStaff);

    // setting list adapter
    expListView.setAdapter(listAdapter);

   // expListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);

    // Listview on child click listener
    expListView.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {

        @Override
        public boolean onChildClick(ExpandableListView parent, View v,
                                    int groupPosition, int childPosition, long id) {
            // TODO Auto-generated method stub



            DoctorObject currentDoc = listDataDoc.get(groupPosition);

            StaffObject currentStaff = listDataChildStaff.get(listDataDoc.get(groupPosition)).get(childPosition);


            selectedItems.add(currentDoc);

            String toastname = currentDoc.getDocname();
            String toastStaff = currentStaff.getStaffname();

            Toast.makeText(getApplicationContext(),
                   toastStaff,
                            Toast.LENGTH_SHORT).show();

            return true;
        }
    });



    /* End of regular expand listview

     */



    nextButton = (Button) findViewById(R.id.nextbuttonTeam);

    nextButton.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            Intent myIntent = new Intent(CreateMyTeamActivity.this, CreateReferralTeamActivity.class);
            myIntent.putParcelableArrayListExtra("NAME", selectedItems);
            //myIntent.putExtra("Selections",selectedItems);
            CreateMyTeamActivity.this.startActivity(myIntent);


        }
    });


}

下一個活動:

public class CreateReferralTeamActivity extends AppCompatActivity {

    @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_create_referral_team);

    Intent b = getIntent();
     ArrayList<DoctorObject> list = (ArrayList<DoctorObject>) b.getSerializableExtra("NAME");

    String lists ="";
    for (int i=0; i < list.size(); i++){
       lists  =  list.get(i).getDocname();
    }



    //TextView text = (TextView) findViewById(R.id.sampleText);

    //text.setText(lists);

    Toast.makeText(getApplicationContext(),
            lists,
            Toast.LENGTH_SHORT).show();

}

}

當我運行它似乎數組是空的。

這是一個動畫的gif:

http://imgur.com/a/EGgL6

如果T對象不是Parcelable對象,則可以使用Gson庫將ArrayList傳遞給另一個Activity。 通用類型在哪里。 您的情況是ArrayList

步驟1:首先使用Gradle腳本導入Gson庫

在您的Gradle依賴項中添加此行

dependencies {
    compile 'com.google.code.gson:gson:2.7'
}

步驟2:將ArrayList轉換為JSON字符串,並將JSON字符串從活動1傳遞到活動2

        ArrayList<DoctorObject> doctors = new ArrayList<Location>();
        doctors.add(new DoctorObject(params));
        doctors.add(new DoctorObject(params));

        Gson gson = new Gson();
        String jsonString = gson.toJson(doctors);
        Intent intent = new Intent(MainActivity.this,MapsActivity.class);
        intent.putExtra("KEY",jsonString);
        startActivity(intent);

步驟3:從Bundle中獲取JSON字符串,並將其轉換回ArrayList

    import java.lang.reflect.Type;


    Bundle bundle = getIntent().getExtras();
    String jsonString = bundle.getString("KEY");

    Gson gson = new Gson();
    Type listOfdoctorType = new TypeToken<List<DoctorObject>>() {}.getType();
    ArrayList<DoctorObject> doctors = gson.fromJson(jsonString,listOfdoctorType );

使用getParcelableArrayListExtra而不是getSerializableExtra因為使用putParcelableArrayListExtra從上一個Activity發送ArrayList對象:

 ArrayList<DoctorObject> list = b.getParcelableArrayListExtra("NAME");

您不能將DoctorObject#writeToParcel()空,這實際上是復制對象數據的方式。

@Override
public void writeToParcel(Parcel dest, int flags) {
    // the order you write to the Parcel has to be the same order you read from the Parcel
    dest.writeInt(DocPic);
    dest.writeString(Docname);
    dest.writeString(Docspecialty);
    dest.writeString(DocLocation);
}

並在其他活動中回讀數據,請使用getParcelableArrayListExtra

ArrayList<DoctorObject> list = b.getParcelableArrayListExtra("NAME");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM