在intent?</int []>中传递ArrayList <int []> []的正确方法是什么?

时间:2014-11-02 11:41:00

标签: java android android-intent arraylist

我有这个集合

ArrayList<int[]>[] myList;

,即整数数组的ArrayLists数组。我试图以意图传递它。

intent.putExtra(getString(R.string.app_name) + ".myList", myList);

在新活动中,我尝试获取额外的:

ArrayList<int[]>[] myList;

Intent intent = getIntent();
myList = (ArrayList<int[]>[]) intent.getSerializableExtra(getString(R.string.app_name) + ".myList");

但是我在该行中获得了一个类强制转换异常。

Caused by: java.lang.ClassCastException: java.lang.Object[] cannot be cast to java.util.ArrayList[]

因为它们包含基本类型的数组而ArrayList本身就是一个可序列化的类,所以我不知道为什么它不起作用或者什么是更好的方法。

修改

似乎不能将Object []强制转换为CustomClass []

检查:

Quick Java question: Casting an array of Objects into an array of my intended class

casting Object array to Integer array error

所以一个解决方案就是

Object[] tmp = (Object[]) intent.getSerializableExtra(getString(R.string.app_name) + ".myList");
myList = Arrays.copyOf(tmp, tmp.length, ArrayList[].class);

或者,可以传递和检索ArrayList

// Calling Activity
ArrayList<ArrayList<int[]>> myIntentList = new ArrayList(Arrays.asList(myList));
intent.putExtra(getString(R.string.app_name) + ".myList", myIntentList);

// Called Activity
ArrayList<ArrayList<int[]>> myIntentList;

myIntentList = ArrayList<ArrayList<int[]>> intent.getSerializableExtra(getString(R.string.app_name) + ".myList");

3 个答案:

答案 0 :(得分:0)

intent.putIntegerArrayListExtra("int", int);

Bundle extras = getIntent().getExtras();
extras.getIntegerArrayList("int");

答案 1 :(得分:0)

我建议做

Serializable ser = (Serializable) list;
String key = getString(R.string.app_name) + ".myList";
intent.putExtra(key, ser);

如果ArrayList []未被识别为Serializable。

答案 2 :(得分:0)

设置ArrayList<int[]>[]

int[] values1 = new int[] { 1, 2, 3 ,4 };
ArrayList<int[]> al1 = new ArrayList<int[]>();
al1.add(values1);

int[] values2 = new int[] { 1, 2, 3 ,4 };
ArrayList<int[]> al2 = new ArrayList<int[]>();
al2.add(values2);

ArrayList<int[]>[] arrayOfIntArrays = new ArrayList[] { al1, al2 };

Intent i = new Intent(this, DemoActivity.class);
i.putExtra("blah", arrayOfIntArrays);

现在,在接收活动上,以下是重建方法:

Object[] objArray = (Object[]) getIntent().getExtras().getSerializable("blah");

List<?> objList = Arrays.asList(objArray);

ArrayList<int[]>[] arrayOfLists = new ArrayList[objList.size()];

arrayOfLists = objList.toArray(arrayOfLists);
// example value extraction
int[] values1 = arrayOfLists[0].get(0);

至于为什么你必须做这一切?这里有一些有些先进的Java概念。

首先,int[] 不是原语。 Java将Array视为Object

第二,Java中的泛型受type erasure的约束。这意味着ArrayList<int[]>的输入在运行时并不存在,它本质上是syntactic sugar

您可能还想了解Java Generics中的协方差和逆变。

显然,如果您可以控制这些对象的创建,可能会有更简洁的方法在您的应用程序中传递此数据。例如,您可以使用包含ArrayList<int[]>[]的{​​{1}}代替ArrayList