帮助将对象的ArrayList传递给新的Activity

时间:2011-07-13 15:15:43

标签: android

我有一个对象的arraylist。即ArrayList。

我想将此传递给新的Activity。我试图使用putParcelableArrayList,但它有对象的问题。我从变量的创建中移除了部分并且该方法有效,但后来我得到eciplse抱怨不安全的东西。

如何将此arrayList传递给新的Activity

感谢您的时间

修改 我试过这个:

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 对象示例代码。我是否需要将此更改为paracbale才能正常工作?

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

10 个答案:

答案 0 :(得分:45)

您的对象类应该实现parcelable。下面的代码可以帮助您入门。

    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];

等等。

答案 1 :(得分:16)

非常简单,请尝试以下方法:

bundle.putSerializable("lstContact", (Serializable) lstObject);
lstObj = (List<Contacts>) bundle.getSerializable("lstContact");

并且您还需要从Serializable接口实现Contact类。 例如:

public class Contact implements Serializable{
   ...
   ...
   ...
}

答案 2 :(得分:14)

您有两种选择:

Android通过序列化和反序列化(通过Serializable或Parcelable)传递Bundle中的Object。因此,要在Bundle中传递的所有对象都必须实现这两个接口中的一个。

使用Serializable可以轻松地序列化大多数对象,并且实现Serializable并向类中添加静态UID比编写Parcelable所需的所有方法/类要简单得多。 / p>

答案 3 :(得分:1)

查看putParcelableArrayList的文档,看起来ObjectName需要扩展'Parcelable'界面才能使其正常工作。你得到的错误似乎也表明了这一点。

我会看这里:http://developer.android.com/reference/android/os/Parcelable.html

答案 4 :(得分:1)

您可以使用Serializable接口传递您的arraylist。 (序列化是将对象转换为字节流以便存储对象或将其传输到内存,数据库或文件的过程。)

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);

在下一个活动中,您需要按照以下步骤获取arraylist

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");
    }
}

答案 5 :(得分:0)

当我必须这样做时,我只需将对象的ArrayList放入extras包中(它必须是一个ArrayList,List显然不是Serializable)。然后,您需要做的就是确保列表中的对象也可以序列化。

答案 6 :(得分:0)

1)确保要包裹的对象已正确实现Parcelable

2)在putParcelableArrayList中使用此参数:new ArrayList <>(list)

示例:

    protected void onSaveInstanceState(Bundle outstate) {
        super.onSaveInstanceState(outstate);
        outstate.putParcelableArrayList("myObjects", new ArrayList<>(myListOfObjects));
    }

答案 7 :(得分:0)

对我有帮助的是: 在写入包裹时设置所有值。如果任何值为NULL,则为该特定属性设置默认值。 为几个参数设置了空值,这就是引发此错误的原因。

答案 8 :(得分:-1)

您可以在某些课程中使用public static字段。

有关更多建议,请参阅here

答案 9 :(得分:-1)

我正在努力解决同样的问题,并找到了一种更好的方法,可以将我的数组放在Global Class中,可以在所有活动中访问。感谢this帖子描述如何使用可跨多个活动访问的全局变量。

我的全球课程是

public class GlobalClass extends Application{ public MyObject[] objArray }

Android Manifest Change

android:name=".GlobalClass"

以多项活动的身份访问

GlobalClass g = (GlobalClass)getApplicationContext();
g.objArray[0].x = 100;
int x = g.objArray[0].x;

为了更好地理解,请通过帖子。