Помощь при передаче объекта ArrayList объектов в новую активность
У меня есть аррайалист объектов. т.е. ArrayList.
Я хочу передать это на новое действие. Я попытался использовать putParcelableArrayList, но у него есть проблемы с объектом. Я удалил часть из создания переменной, и этот метод работает, но затем я получаю призыв, жалующийся на небезопасные вещи.
Как передать этот массивList в новую активность
Спасибо за ваше время
ИЗМЕНИТЬ
Я пробовал это:
ArrayList<ObjectName> arraylist = new Arraylist<ObjectName>();
Bundle bundle = new Bundle();
bundle.putParcelableArrayList("arraylist", arraylist);
Я получаю следующую ошибку:
The method putParcelableArrayList(String, ArrayList<? extends Parcelable>) in the type Bundle is not applicable for the arguments (String, ArrayList<ObjectName>)
EDIT2
Код примера объекта. Мне нужно изменить это для работы на паракбале?
public class ObjectName {
private int Value1;
private int Value2;
private int Value3;
public ObjectName (int pValue1, int pValue2, int Value3) {
Value1 = pValue1;
Value2 = pValue2;
Value3 = pValue3;
}
// Get Statements for each value below
public int getValue1() {
return Value1;
}
// etc
Ответы
Ответ 1
Класс объекта должен быть применимым. Код, приведенный ниже, поможет вам начать работу.
public class ObjectName implements Parcelable {
// Your existing code
public ObjectName(Parcel in) {
super();
readFromParcel(in);
}
public static final Parcelable.Creator<ObjectName> CREATOR = new Parcelable.Creator<ObjectName>() {
public ObjectName createFromParcel(Parcel in) {
return new ObjectName(in);
}
public ObjectName[] newArray(int size) {
return new ObjectName[size];
}
};
public void readFromParcel(Parcel in) {
Value1 = in.readInt();
Value2 = in.readInt();
Value3 = in.readInt();
}
public int describeContents() {
return 0;
}
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(Value1);
dest.writeInt(Value2);
dest.writeInt(Value3);
}
}
Чтобы использовать вышеизложенное, выполните следующие действия:
В операции "отправка" используйте:
ArrayList<ObjectName> arraylist = new Arraylist<ObjectName>();
Bundle bundle = new Bundle();
bundle.putParcelableArrayList("arraylist", arraylist);
В операции "получение" используйте:
Bundle extras = getIntent().getExtras();
ArrayList<ObjectName> arraylist = extras.getParcelableArrayList("arraylist");
ObjectName object1 = arrayList[0];
и т.д.
Ответ 2
Очень простой способ, попробуйте следующее:
bundle.putSerializable("lstContact", (Serializable) lstObject);
lstObj = (List<Contacts>) bundle.getSerializable("lstContact");
а также вам нужно будет реализовать свой класс Contact из интерфейса Serializable. пример:
public class Contact implements Serializable{
...
...
...
}
Ответ 3
У вас есть два варианта:
Android передает объект в Bundle путем сериализации и десериализации (через Serializable или Parcelable). Таким образом, все ваши объекты, которые вы хотите передать в Bundle, должны реализовать один из этих двух интерфейсов.
Большинство объектов легко сериализуются с помощью Serializable
, и гораздо проще реализовать Serializable
и добавить в класс статический UID, чем писать все методы/классы, необходимые для Parcelable
.
Ответ 4
Взглянув на документацию для putParcelableArrayList
, похоже, что ваш ObjectName
должен расширить интерфейс Parcelable, чтобы это работало. Похожая ошибка также указывает на это.
Я бы посмотрел здесь: http://developer.android.com/reference/android/os/Parcelable.html
Ответ 5
Вы можете передать свой arraylist используя интерфейс Serializable. (Сериализация - это процесс преобразования объекта в поток байтов, чтобы сохранить объект или передать его в память, базу данных или файл.)
public class ObjectName implements Serializable{
private int Value1;
private int Value2;
private int Value3;
public ObjectName (int pValue1, int pValue2, int Value3) {
Value1 = pValue1;
Value2 = pValue2;
Value3 = pValue3;
}
// Get Statements for each value below
public int getValue1() {
return Value1;
}
// etc
}
Сейчас в вашей текущей деятельности
// here is the arrayList of yours
ArrayList<ObjectName> objNamesList = new ArrayList<>();
objNamesList.add(new ObjectName(1,1,1));
objNamesList.add(new ObjectName(2,2,2));
//intialize bundle instance
Bundle b = new Bundle();
//adding data into the bundle
//key => objNames referece for the arrayList
//value => objNamesList , name of the arrayList
//cast the arraylist into Serializable
b.putSerializable("objNames", (Serializable) objNamesList);
//init the intent
Intent i = new Intent(CurrentActivity.this, NextActivity.class);
i.putExtras(b);
startActivity(i);
на следующем занятии вам нужно будет сделать следующее, чтобы получить список
public class NextActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_next_activity);
// get the bundle
Bundle b = getIntent().getExtras();
ArrayList<ObjectName> q = (ArrayList<ObjectName>) b.getSerializable("objNames");
}
}
Ответ 6
Когда мне приходилось это делать, я просто помещал ArrayList объектов в пакет экстрас (он должен быть ArrayList, List, по-видимому, не Serializable). Затем все, что вам нужно сделать, это обеспечить, чтобы объекты внутри списка также были сериализованы.
Ответ 7
1) Убедитесь, что объект, который вы хотите отправить, правильно реализовал Parcelable
2) Используйте этот аргумент в putParcelableArrayList: new ArrayList<> (список)
Пример:
protected void onSaveInstanceState(Bundle outstate) {
super.onSaveInstanceState(outstate);
outstate.putParcelableArrayList("myObjects", new ArrayList<>(myListOfObjects));
}
Ответ 8
что мне помогло: установить все значения при записи в посылку. В случае, если любое значение равно NULL, я устанавливаю значение по умолчанию для этого конкретного свойства. Нулевые значения были установлены для нескольких параметров, и именно поэтому эта ошибка была выброшена.
Ответ 9
В некоторых классах можно использовать поле public static
.
Смотрите здесь для получения дополнительных советов.
Ответ 10
Я боролся с одной и той же проблемой и нашел гораздо лучший подход для размещения моего массива в глобальном классе, к которому можно получить доступ во всех действиях. Благодаря этой публикации для описания того, как использовать глобальные переменные, к которым можно получить доступ в нескольких действиях.
Мой глобальный класс
public class GlobalClass extends Application{
public MyObject[] objArray
}
Изменение манифеста Android
android:name=".GlobalClass"
Доступен в нескольких действиях как
GlobalClass g = (GlobalClass)getApplicationContext();
g.objArray[0].x = 100;
int x = g.objArray[0].x;
Для лучшего понимания пройдите через сообщение.