#java #android
#java #Android
Вопрос:
Я знаю, что вы можете передать список строк массива через намерение, но что, если это список массива какого-либо объекта, который я определил? Допустим, список Bicyles массива, как мне это сделать?
Ответ №1:
Вы можете реализовать свои объекты с возможностью разбиения на части и использовать putParcelableArrayListExtra
. В качестве альтернативы, вы можете каким-либо образом сериализовать свои объекты и поместить массив байтов ваших сериализованных объектов.
Комментарии:
1. @adit — Для примера кода, позволяющего сделать что-либо разделяемым, посмотрите на документы для Parcelable . Затем вы можете использовать ArrayList<MyParcelableClass> при вызове
putParcelableArrayListExtra()
.2. возникли проблемы, поскольку мой объект имеет объект Location, поэтому я действительно не знаю, как справиться с этим в методе writeToParcel
3. @adit — Location реализует сам Parcelable, поэтому в вашем методе writeToParcel вы можете просто использовать Parcel
writeParcelable
для записи местоположения вместе с остальными вашими данными.4. пожалуйста, приводите примеры, а не предложения
Ответ №2:
Это пример. MainActivity
отправляет список пользователей OtherActivity
через Intent
.
class Person implements Serializable {
int id;
String name;
Person(int i, String s) {
id = i;
name = s;
}
}
public class TestAndroidActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ArrayList<Person> list = new ArrayList<Person>();
list.add(new Person(1, "Tom"));
list.add(new Person(5, "John"));
Intent intent = new Intent(this, OtherActitity.class);
intent.putExtra("list", list);
startActivity(intent);
OtherActivity.java
import java.util.ArrayList;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.Toast;
public class OtherActitity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.other);
Intent i = getIntent();
ArrayList<Person> list = (ArrayList<Person>) i
.getSerializableExtra("list");
Toast.makeText(this, list.get(1).name, Toast.LENGTH_LONG).show();
}
}
Комментарии:
1. Обратите внимание, что использование Serializable для этого влечет за собой снижение производительности, поэтому вам действительно следует использовать Parcelable .
2.
intent.putExtra("list", list);
выдает ошибку :cannot resolve method
3. Спасибо за ответ, это помогло мне решить проблему. У меня есть один вопрос. Когда я создаю
List<Person> list = new ArrayList<>();
объект, он выдает ошибку. Но созданиеArrayList<Person> list = new ArrayList<>();
объекта не дало никакой ошибки. В чем разница.4. @viper Возможно, вы забыли импортировать java.util.List;
5. Обратите внимание, что вы ДОЛЖНЫ передать ArrayList , а не список , иначе он покажет ошибку:
Cannot resolve method putExtra
Ответ №3:
Еще один способ — вы можете сериализовать список объектов в какое-либо строковое представление (пусть это будет JSON), а затем получить строковое значение обратно в list
// here we use GSON to serialize mMyObjectList and pass it throught intent to second Activity
String listSerializedToJson = new Gson().toJson(mMyObjectList);
intent.putExtra("LIST_OF_OBJECTS", listSerializedToJson);
startActivity(intent);
// in second Activity we get intent and retrieve the string value (listSerializedToJson) back to list
String listSerializedToJson = getIntent().getExtras().getString("LIST_OF_OBJECTS");
mMyObjectList = new Gson().fromJson(objectsInJson, MyObject[].class); // in this example we have array but you can easy convert it to list - new ArrayList<MyObject>(Arrays.asList(mMyObjectList));
Ответ №4:
Лучшая идея — реализовать разделяемый интерфейс для объекта, arraylist которого вы хотите поместить в намерение.Например :
public class Person implements Parcelable{
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public int describeContents() {
return this.hashCode();
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(id);
dest.writeString(name);
}
}
И затем код приложения, который вы можете сказать :
bundle.putParcelableArrayList("personList", personList);
Комментарии:
1. Это то, что говорится в первом ответе.