将自定义对象的数组列表传递给另一个 activity

Passing arraylist of custom object to another activity

单击单元格时,对象将添加到数组中。这个数组需要传递到另一个 activity。出于测试目的,我传递了只有一个对象 DoctorObject 的数组。然后在下一个 activity 中,我使用 .getName() 将名称作为字符串获取,并将其显示在 toast 中。然而吐司是空的。

这里是一些代码片段

对象:

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

Activity:

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


        }
    });


}

下一个Activity:

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

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

要在另一个 activity 中读回您的数据,请使用 getParcelableArrayListExtra

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

如果您的 T 对象不是 Parcelable 对象,您可以使用 Gson 库将 ArrayList 传递给另一个 Activity。通用类型在哪里。在你的例子中,它是 ArrayList

第 1 步:首先使用 Gradle 脚本导入 Gson 库

将此行添加到您的 Gradle 依赖项中

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

第 2 步:将 ArrayList 转换为 JSON 字符串并将 JSON 字符串从 Activity 1 传递到 Activity 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 );