如何将一个地址对象数组传递给另一个活动(Activity)

5
我正在尝试通过Intent对象将一个Address对象数组传递到另一个Activity。由于Address类实现了Parcelable接口,因此我尝试进行以下操作。我从Geocoder对象中获取了一个Address对象列表,然后将其转换为Address对象数组。然后我将这个数组放入Intent中并调用Activity。
final Address[] addresses = addresseList.toArray(new Address[addresseList.size()]);

final Intent intent = new Intent(this, SelectAddress.class);
intent.putExtra(SelectAddress.INTENT_EXTRA_ADDRESSES, startAddresses);

startActivityForResult(intent, REQUEST_CODE_ACTIVITY_SELECT_ADDRESSES);

在另一个活动中,我尝试使用以下代码从Intent中检索Address[]。但是最后一行的调用以ClassCastException Landroid.os.Parcelable结束。

Bundle bundle = getIntent().getExtras();            
Address[] addresses = (Address[]) bundle.getParcelableArray(INTENT_EXTRA_ADDRESSES);

我做错了什么? 我该如何检索Address[]。

嗨,我正在尝试通过Intent对象将一个Address对象数组传递到另一个Activity。但是,为什么要这样做呢?在我的看法中,跨Activity之间传递复杂对象不利于代码的可读性和可维护性。可以将Intent extras视为URL上的GET参数。如果这两个页面是Web页面,你是否会在链接中将一堆Address对象作为GET参数传递?假设无法避免传递Address对象数组,那么你得到的对象类型是什么?ClassCastException行应该告诉你答案。 - CommonsWare
ClassCastException 提到的类型是 Landroid.os.Parcelable。 - Flo
关于您对将复杂对象数组传递到活动中的担忧。我想要做的是提供用户一个第二个活动,在第一个活动中搜索地址返回多个结果时,用户可以从地址列表中选择。如果不将地址传递到第二个活动以在下拉菜单中显示它们,那么您会如何实现这一点? - Flo
@CommensWare:在单个活动中切换布局和视图就可以解决问题了吗?为什么不用第二个活动? - Flo
这解决了我传递对象数组的问题。 - Atul Bhardwaj
3个回答

14
问题出在类型转换上。尝试使用以下代码:
Bundle bundle = getIntent().getExtras();
Parcelable[] parcels = bundle.getParcelableArray(INTENT_EXTRA_ADDRESSES);

Address[] addresses = new Address[parcels.length];
for (Parcelable par : parcels){
     addresses.add((Address) par);              
}

9
答案是正确的,但你从什么时候开始使用".add"方法往数组里添加元素了?哈哈。 使用以下代码:** for(int i=0;i<parcels.length;i++){ addresses[i] = (Address) parcels[i]; } ** - Shehaaz

5
或在Java1.6上: Parcelable[] x = bundle.getParcelableArray(KEY); addresses = Arrays.copyOf(x, x.length, Address[].class);

3
欢迎来到StackOverflow!虽然您已经提供了一个答案,但最好还是进一步澄清您的解决方案所提供的内容,并说明它如何帮助OP解决他们的问题。 - Mike Koch
它有助于您不需要编写循环,只需一行代码即可。 - Malachiasz

1

@LiorZ答案完全正确。我将他的答案和另一个答案合并到了这个方便的函数中。

@SuppressWarnings("unchecked")
private static <T extends Parcelable> T[] castParcelableArray(Class<T> clazz, Parcelable[] parcelableArray) {
    final int length = parcelableArray.length;
    final T[] array = (T[]) Array.newInstance(clazz, length);
    for (int i = 0; i < length; i++) {
        array[i] = (T) parcelableArray[i];
    }
    return array;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接