将自定义对象的数组列表传递给另一个 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 动画:
使用 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 );
单击单元格时,对象将添加到数组中。这个数组需要传递到另一个 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 动画:
使用 getParcelableArrayListExtra
而不是 getSerializableExtra
因为使用 putParcelableArrayListExtra
:
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 );