3

I've tried many different solutions found here and many other sites - but i just can't make it work!

I have an object "Apartment" in one activity which is to be used in another activity. The activity is started from the class MyMapOverlayItem and should start the ApartmentInfoActivity in which the Apartment object should be used.

MyMapOverlayItem.java :

package com.android.madsoft.spotter;

import java.util.ArrayList;

import android.content.Context;
import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.os.Bundle;

import com.google.android.maps.ItemizedOverlay;
import com.google.android.maps.OverlayItem;

public class MyMapOverlayIcon extends ItemizedOverlay<OverlayItem> {
    Context mContext;
    ArrayList<Apartment> myList;
    private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();
    public MyMapOverlayIcon(Drawable defaultMarker) {
        super(defaultMarker);

    }

    public MyMapOverlayIcon(Drawable defaultMarker, Context context, ArrayList<Apartment> myList) {
        super(boundCenterBottom(defaultMarker));
          mContext = context;
          this.myList = myList;

        }

    public void addOverlay(OverlayItem overlay) {
        mOverlays.add(overlay);
        populate();
    }

    @Override
    protected boolean onTap(int index) {
        Apartment ap = myList.get(index);
        ApartmentParcel ap1 = new ApartmentParcel(ap);
        Intent i = new Intent(mContext, ApartmentInfoActivity.class);
        Bundle b = new Bundle();
        b.putParcelable("app", ap1);
        i.putExtras(b);
//      i.putExtra("app",ap1);
//      b.putSerializable("apartment", ap);

        // WHAT TO DO!?

        mContext.startActivity(i);

      return true;
    }

    @Override
    protected OverlayItem createItem(int i) {
      return mOverlays.get(i);
    }

    @Override
    public int size() {
      return mOverlays.size();
    }

}

Apartment.java :

package com.android.madsoft.spotter;

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;


public class Apartment {


    private static final long serialVersionUID = 1L;
    int latitude, longitude;
    String id, 
    zipcode, 
    size, 
    rooms, 
    rentprice, 
    deposit, 
    takeoverdate, 
    rentperiod, 
    furniturized, 
    usagecost, 
    addeddate, 
    description,
    prepaid;
    ArrayList<String> imageList, phonenumbers;
    int imagecount = 1;
    ArrayList<Bitmap> bigBitmapList;
    ArrayList<Bitmap> smallBitmapList;

    public Apartment(String id, int latitude, int longitude, 
                    String zipcode, String size, String rooms, 
                    String rentprice, String deposit, String prepaid, String takeoverdate, 
                    String rentperiod, String furniturized, String usagecost, 
                    String addeddate, String description, ArrayList<String> imageList, ArrayList<String> phonenumbers){
        bigBitmapList = new ArrayList<Bitmap>();
        smallBitmapList = new ArrayList<Bitmap>();
        this.addeddate = addeddate;
        this.deposit = deposit;
        this.description = description;
        this.furniturized = furniturized;
        this.id = id;
        this.imageList = imageList;
        this.latitude = latitude;
        this.longitude = longitude;
        this.phonenumbers = phonenumbers;
        this.prepaid = prepaid;
        this.rentperiod = rentperiod;
        this.rentprice = rentprice;
        this.rooms = rooms;
        this.size = size;
        this.takeoverdate = takeoverdate;
        this.usagecost = usagecost;
        this.zipcode = zipcode;

        for (String s :imageList){

            URL myFileUrl = null;
            try {
                 myFileUrl= new URL(s);
            } catch (MalformedURLException e) {
                 e.printStackTrace();
            }
            try {
                 HttpURLConnection conn= (HttpURLConnection)myFileUrl.openConnection();
                 conn.setDoInput(true);
                 conn.connect();
                 InputStream is = conn.getInputStream();
                 Bitmap image = BitmapFactory.decodeStream(is); //Saves the current icon
                 bigBitmapList.add(image);
                 //Icon will now be resized to 125px*100px               
                    Bitmap resized; 
                    int scalerate = (int)image.getHeight()/60;
                    int newHeight = (int)image.getHeight()/scalerate;
                    int newWidth = (int)image.getWidth()/scalerate; 
                    resized = Bitmap.createScaledBitmap(image, newWidth, newHeight, false);
                    smallBitmapList.add(resized);
            }
            catch (IOException e) {
                e.printStackTrace();
            }
            }
        }

ApartmentParcel.java :

package com.android.madsoft.spotter;

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Parcel;
import android.os.Parcelable;

public class ApartmentParcel implements Parcelable {

    private static final long serialVersionUID = 1L;
    int latitude, longitude;
    String id, 
    zipcode, 
    size, 
    rooms, 
    rentprice, 
    deposit, 
    takeoverdate, 
    rentperiod, 
    furniturized, 
    usagecost, 
    addeddate, 
    description,
    prepaid;
    ArrayList<String> imageList, phonenumbers;
    int imagecount = 1;
    ArrayList<Bitmap> bigBitmapList;
    ArrayList<Bitmap> smallBitmapList;

    public ApartmentParcel(String id, int latitude, int longitude, 
                    String zipcode, String size, String rooms, 
                    String rentprice, String deposit, String prepaid, String takeoverdate, 
                    String rentperiod, String furniturized, String usagecost, 
                    String addeddate, String description, ArrayList<String> imageList, ArrayList<String> phonenumbers){
        bigBitmapList = new ArrayList<Bitmap>();
        smallBitmapList = new ArrayList<Bitmap>();
        this.addeddate = addeddate;
        this.deposit = deposit;
        this.description = description;
        this.furniturized = furniturized;
        this.id = id;
        this.imageList = imageList;
        this.latitude = latitude;
        this.longitude = longitude;
        this.phonenumbers = phonenumbers;
        this.prepaid = prepaid;
        this.rentperiod = rentperiod;
        this.rentprice = rentprice;
        this.rooms = rooms;
        this.size = size;
        this.takeoverdate = takeoverdate;
        this.usagecost = usagecost;
        this.zipcode = zipcode;

        for (String s :imageList){

            URL myFileUrl = null;
            try {
                 myFileUrl= new URL(s);
            } catch (MalformedURLException e) {
                 e.printStackTrace();
            }
            try {
                 HttpURLConnection conn= (HttpURLConnection)myFileUrl.openConnection();
                 conn.setDoInput(true);
                 conn.connect();
                 InputStream is = conn.getInputStream();
                 Bitmap image = BitmapFactory.decodeStream(is); //Saves the current icon
                 bigBitmapList.add(image);
                 //Icon will now be resized to 125px*100px               
                    Bitmap resized; 
                    int scalerate = (int)image.getHeight()/60;
                    int newHeight = (int)image.getHeight()/scalerate;
                    int newWidth = (int)image.getWidth()/scalerate; 
                    resized = Bitmap.createScaledBitmap(image, newWidth, newHeight, false);
                    smallBitmapList.add(resized);
            }
            catch (IOException e) {
                e.printStackTrace();
            }
            }
        }

    public ApartmentParcel(Apartment ap){
        bigBitmapList = new ArrayList<Bitmap>();
        smallBitmapList = new ArrayList<Bitmap>();
        this.addeddate = ap.getAddeddate();
        this.deposit = ap.getDeposit();
        this.description = ap.getDescription();
        this.furniturized = ap.getFurniturized();
        this.id = ap.getId();
        this.imageList = ap.getImageList();
        this.latitude = ap.getLatitude();
        this.longitude = ap.getLongitude();
        this.phonenumbers = ap.getPhonenumbers();
        this.prepaid = ap.getPrepaid();
        this.rentperiod = ap.getRentperiod();
        this.rentprice = ap.getRentprice();
        this.rooms = ap.getRooms();
        this.size = ap.getSize();
        this.takeoverdate = ap.getTakeoverdate();
        this.usagecost = ap.getUsagecost();
        this.zipcode = ap.getZipcode();
        runMyParcel();
    }

    private void runMyParcel(){
        for (String s :imageList){

            URL myFileUrl = null;
            try {
                 myFileUrl= new URL(s);
            } catch (MalformedURLException e) {
                 e.printStackTrace();
            }
            try {
                 HttpURLConnection conn= (HttpURLConnection)myFileUrl.openConnection();
                 conn.setDoInput(true);
                 conn.connect();
                 InputStream is = conn.getInputStream();
                 Bitmap image = BitmapFactory.decodeStream(is); //Saves the current icon
                 bigBitmapList.add(image);
                 //Icon will now be resized to 125px*100px               
                    Bitmap resized; 
                    int scalerate = (int)image.getHeight()/60;
                    int newHeight = (int)image.getHeight()/scalerate;
                    int newWidth = (int)image.getWidth()/scalerate; 
                    resized = Bitmap.createScaledBitmap(image, newWidth, newHeight, false);
                    smallBitmapList.add(resized);
            }
            catch (IOException e) {
                e.printStackTrace();
            }
            }
    }

    public void setSmallBitmapList(ArrayList<Bitmap> smallBitmapList) {
        this.smallBitmapList = smallBitmapList;
    }


    @Override
    public int describeContents() {
        // TODO Auto-generated method stub
        return 0;
    }


    @Override
    public void writeToParcel(Parcel out, int flags) {
        out.writeString(id); 
        out.writeString(zipcode); 
        out.writeString(size); 
        out.writeString(rooms); 
        out.writeString(rentprice); 
        out.writeString(deposit); 
        out.writeString(takeoverdate); 
        out.writeString(rentperiod); 
        out.writeString(furniturized);
        out.writeString(usagecost);
        out.writeString(addeddate);
        out.writeString(description);
        out.writeString(prepaid);
        out.writeStringList(phonenumbers);
        out.writeList(bigBitmapList);
        out.writeList(smallBitmapList);

    }

    private ApartmentParcel(Parcel in) {
        id = in.readString();
        zipcode = in.readString();
        size = in.readString();     
        rooms = in.readString();
        rentprice = in.readString();
        deposit = in.readString();
        takeoverdate = in.readString();
        rentperiod = in.readString();
        furniturized = in.readString();
        usagecost = in.readString();
        addeddate = in.readString();
        description = in.readString();
        prepaid = in.readString();
        in.readStringList(phonenumbers);
        in.readTypedList(bigBitmapList, Bitmap.CREATOR);
        in.readTypedList(smallBitmapList, Bitmap.CREATOR);
    }

    public static final Creator<ApartmentParcel> CREATOR = new Creator<ApartmentParcel>() {
        public ApartmentParcel createFromParcel(Parcel in) {
            return new ApartmentParcel(in);
        }

        public ApartmentParcel[] newArray(int size) {
            return new ApartmentParcel[size];
        }
    };
}

ApartmentInfoActivity.java :

    package com.android.madsoft.spotter;

    import android.app.Activity;
    import android.os.Bundle;
    import android.widget.TextView;

    public class ApartmentInfoActivity extends Activity {


        @Override
            protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.infoview);
//      Apartment ap = (Apartment)getIntent().getSerializableExtra("apartment");
        Apartment ap = (Apartment)getIntent().getParcelableExtra("app");
        TextView zipView = (TextView)findViewById(R.id.txtInfoZip);
        zipView.setText(ap.getZipcode());
    }

    }
Jonathan Leffler
  • 666,971
  • 126
  • 813
  • 1,185
JReneM
  • 31
  • 1
  • 3

2 Answers2

2

Make your Aparment class implement Serializable:

public class Apartment implements Serializable{

Then on MyMapOverlayIcon:

Bundle b = new Bundle();
// WHAT TO DO!?
b.putSerializable("apartment", ap);

Then on ApartmentInfoActivity:

Apartment ap = (Apartment) getIntent().getSerializableExtra("apartment");
Cristian
  • 191,931
  • 60
  • 351
  • 260
0

The preferred way to share objects between activities is to make the shared object Parcelable http://developer.android.com/reference/android/os/Parcelable.html (see also http://developer.android.com/reference/android/os/Parcelable.Creator.html). Then you can define a String key somewhere and it use it for putting and getting the Parcelable item into and from a Bundle object.

In the main activity:

Intent newActivity = ...;
Bundle extras = new Bundle();

// use your key here to put the parcelable into the bundle

newActivity.putExtras(extras);
startActivity(newActivity);

And in the child Activity

//child activity (onCreate())
Bundle intentExtras = getIntent().getExtras();
if(intentExtras != null){
   // use the key here to get your parcelable from the bundle
}

If you have a collection of items in your class that is implementing Parcelable you can handle it like this:

import java.util.ArrayList;
import java.util.Collection;

import android.graphics.Bitmap;
import android.os.Parcel;
import android.os.Parcelable;

public class ExampleParcelable implements android.os.Parcelable {

    private final String id;
    private final ArrayList<Bitmap> bitmapList = new ArrayList<Bitmap>();

    public ExampleParcelable(String id, Collection<Bitmap> bitmaps){
        this.id = id;
        this.bitmapList.addAll(bitmaps);
    }


    @Override
    public void writeToParcel(Parcel out, int flags) {
        // write stack to be duplicated in 'createFromParcel(Parcel in)'
        out.writeString(id);
        out.writeList(bitmapList);
    }

    @Override
    public int describeContents() {
        // your own logic here
        return 0;
    }

    public static final Parcelable.Creator<ExampleParcelable> CREATOR = new Parcelable.Creator<ExampleParcelable>() {

        @Override
        public ExampleParcelable createFromParcel(Parcel in) {
            String id = in.readString();
            @SuppressWarnings("unchecked")
            ArrayList<Bitmap> bitmaps = (ArrayList<Bitmap>)in.readArrayList(Bitmap.class.getClassLoader());
            return new ExampleParcelable(id, bitmaps);
        }

        @Override
        public ExampleParcelable[] newArray(int size) {
            return new ExampleParcelable[size];
        }
    };
}
cyber-monk
  • 5,260
  • 6
  • 29
  • 41
  • I've tried that, but couldn't get it to work. Can it be because there is types like ArrayList in the Apartment object? – JReneM May 02 '11 at 18:07
  • If needed you can get the URI for the Bitmap and just pass that, but you can have lists in your Parcelable. – cyber-monk May 02 '11 at 18:11