Как передать массив объектов Address в другой Acitvity - PullRequest
5 голосов
/ 05 сентября 2010

Я пытаюсь передать массив объектов Address другому Activity через объект Intent.

Поскольку класс Address реализует интерфейс Parcelable , я пытаюсь сделать следующее. Я получил объект List Address из объекта Geocoder, который я преобразовал в массив объектов Address. Затем я помещаю этот массив в Intent и вызываю действие.

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

В другом задании я пытаюсь получить адрес [] из намерения с помощью следующего фрагмента кода. Но вызов последней строки заканчивается ClassCastException Landroid.os.Parcelable.

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

Что я делаю не так? Как мне получить адрес [].

Ответы [ 3 ]

14 голосов
/ 03 сентября 2011

Проблема в кастинге.попробуй:

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);              
}
5 голосов
/ 17 июня 2014
or on java1.6:
    Parcelable[] x = bundle.getParcelableArray(KEY);
    addresses = Arrays.copyOf(x, x.length, Address[].class);
0 голосов
/ 13 февраля 2014

Ответ @ 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;
}
...