Подтвердить что ты не робот

Помощь при передаче объекта 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
4b9b3361

Ответ 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

У вас есть два варианта:

  • Объекты в ArrayList помещают реализацию Parceable в соответствии с требованиями метода putParcelableArrayList ()

  • Или объекты могут реализовать Serializable и использовать метод putSerializable() для добавьте ArrayList, т.е. bundle.putSerializable("arraylist", arraylist);

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;

Для лучшего понимания пройдите через сообщение.