Массив список объектов через намерение

#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. Это то, что говорится в первом ответе.