Tirolel Tirolel - 2 months ago 7
Android Question

get other values from marker

I'm stuck with this problem and I hope someone can lead me to a solution, I have spent 3 days on it until now..

The Problem

I have 2 activities, activity A is a listview populated from a JSON list. Activity B is Google maps v2 based with the same json list but its on Map not on list.

on activity A list there is

onItemclicklistener
and when I click on it shows another activity and its works fine. no problem here. everything works like is supposed too.

on Activity B there is map fragment, and it's filled with lat-lng values from a JSON list too. So there is 10 +markers on map. So when I click on marker, I am getting the name and address and its working fine too.

This what I Want

When I clicking the item on list it taking me to activity C. and there are some textviews to show which days the company are open. this step is done, its working fine and everything like it supposed too.

When I click on Map, there are markers, So I have
onInfoWindowClick()
. It's fine too but how i can get more values from the
onInfoWindowClick()
?

What i mean is, i can get (getSnippet and getTitle from marker) But I have other values in the list, like name, days, id's. this what i getting is only .getsnippet and getTitle through the marker.

I am very stuck with this issue.
I really want to do the same like on the List. When I press on list its getting all values but when iam on Maps i can only get marker window with Title and Snippet. Iam sorry if I couldnt explain good, pls feel free to ask me if there is more code you want too see.

for (HashMap<String, String> hashMap : contactList) {
map.addMarker(new MarkerOptions()
.position(new LatLng(Double.valueOf(hashMap.get(TAG_LAT)) , Double.valueOf(hashMap.get(TAG_LNG))))
.title(hashMap.get(TAG_ADDRESS))
.snippet(hashMap.get(TAG_NAME)) );





@Override
public void onInfoWindowClick(Marker marker) {

marker.getTitle();
marker.getSnippet();
}


UPDATED CODE

public class MapBased extends AbstractMapActivity implements OnNavigationListener,OnInfoWindowClickListener
{
private static final String TAG_Location = "location_id";
private static final String TAG_Company = "company_id";
private static final String TAG_PLACE = "place";
private static final String TAG_POSTAL = "postal";
private static final String TAG_CITY = "city";
private static final String TAG_MONDAY = "monday";
private static final String TAG_TUESDAY = "tuesday";
private static final String TAG_WEDNESDAY = "wednesday";
private static final String TAG_THURSDAY = "thursday";
private static final String TAG_FRIDAY = "friday";
private static final String TAG_SATURDAY = "saturday";
private static final String TAG_SUNDAY = "sunday";
private static final String TAG_TYPE = "type";
private static final String TAG_NOCAR = "nocar";

private static final String TAG_NAME = "name";
private static final String TAG_LAT = "lat";
private static final String TAG_LNG = "lng";
private static final String TAG_ADDRESS = "address";
private static final String TAG = "Debug of Project"; //

private String a;
private String b;

private double my_lat;
private double my_lng;

private static final String STATE_NAV="nav";
private static final int[] MAP_TYPE_NAMES= { R.string.normal, R.string.hybrid, R.string.satellite, R.string.terrain };
private static final int[] MAP_TYPES= { GoogleMap.MAP_TYPE_NORMAL, GoogleMap.MAP_TYPE_HYBRID, GoogleMap.MAP_TYPE_SATELLITE,
GoogleMap.MAP_TYPE_TERRAIN };
private GoogleMap map=null;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SQLiteDatabase db = openOrCreateDatabase("mydb.db", Context.MODE_PRIVATE, null);
db.execSQL("CREATE TABLE IF NOT EXISTS gps_kordinater (ID INTEGER PRIMARY KEY AUTOINCREMENT, Latitude REAL, Longitude REAL);");

String query = "SELECT Latitude,Longitude FROM gps_kordinater WHERE Id = (SELECT MAX(Id) FROM gps_kordinater)";
Cursor cursor = db.rawQuery(query, null);
if(cursor != null)
{
cursor.moveToFirst();
a = cursor.getString(0);

b = cursor.getString(1);
}


String url = "http://example.com";

my_lat = Double.valueOf(a);
my_lng = Double.valueOf(b);


db.close();

// now enabled if disabled = ingen support for jb aka 4.0
if (android.os.Build.VERSION.SDK_INT > 9) {
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
}

ArrayList<HashMap<String, String>> contactList = new ArrayList<HashMap<String, String>>();
JSONParser jParser = new JSONParser();
JSONArray json = jParser.getJSONFromUrl(url);
try {
for(int i = 0; i < json.length(); i++){
JSONObject c = json.getJSONObject(i);

String lat = c.getString(TAG_LAT);
String lng = c.getString(TAG_LNG);
String name = c.getString(TAG_NAME);
String adresse = c.getString(TAG_ADDRESS);

String location_id = c.getString(TAG_Location);
String company_id = c.getString(TAG_Company);
String place = c.getString(TAG_PLACE) ;
String postal = c.getString(TAG_POSTAL);
String city = c.getString(TAG_CITY);
String monday = c.getString(TAG_MONDAY);
if(c.getString(TAG_MONDAY).isEmpty())
{
monday="Lukket";
}
else
{
monday=c.getString(TAG_MONDAY);
}

String tuesday = c.getString(TAG_TUESDAY);
if(c.getString(TAG_TUESDAY).isEmpty())
{
tuesday="Lukket";
}
else
{
tuesday=c.getString(TAG_TUESDAY);
}

String wednesday = c.getString(TAG_WEDNESDAY);
if(c.getString(TAG_WEDNESDAY).isEmpty())
{
wednesday="Lukket";
}
else
{
wednesday=c.getString(TAG_WEDNESDAY);
}

String thursday = c.getString(TAG_THURSDAY);
if(c.getString(TAG_THURSDAY).isEmpty())
{
thursday="Lukket";
}
else
{
thursday=c.getString(TAG_THURSDAY);
}

String friday = c.getString(TAG_FRIDAY);
if(c.getString(TAG_FRIDAY).isEmpty())
{
friday="Lukket";
}
else
{
friday=c.getString(TAG_FRIDAY);
}

String saturday = c.getString(TAG_SATURDAY);
if(c.getString(TAG_SATURDAY).isEmpty())
{
saturday="Lukket";
}
else
{
saturday=c.getString(TAG_SATURDAY);
}

String sunday=c.getString(TAG_SUNDAY);
if(c.getString(TAG_SUNDAY).isEmpty())
{
sunday="Lukket";
}
else
{
sunday=c.getString(TAG_SUNDAY);
}



String nocar = c.getString(TAG_NOCAR);
String type = c.getString(TAG_TYPE);


// creating new HashMap
HashMap<String, String> map2 = new HashMap<String, String>();

// adding each child node to HashMap key => value

map2.put(TAG_LAT, lat);
map2.put(TAG_LNG, lng);

map2.put(TAG_NAME, name);
map2.put(TAG_ADDRESS, adresse);
map2.put(TAG_Location, location_id);
map2.put(TAG_Company, company_id);
map2.put(TAG_PLACE, place);
map2.put(TAG_POSTAL, postal);
map2.put(TAG_CITY, city);
map2.put(TAG_MONDAY, monday);
map2.put(TAG_TUESDAY, tuesday);
map2.put(TAG_WEDNESDAY, wednesday);
map2.put(TAG_THURSDAY, thursday);
map2.put(TAG_FRIDAY, friday);
map2.put(TAG_SATURDAY, saturday);
map2.put(TAG_SUNDAY, sunday);
map2.put(TAG_TYPE, type);
map2.put(TAG_NOCAR, nocar);

// adding HashList to ArrayList
contactList.add(map2);

Log.d(TAG, "Hashmap 1: " + map2);

Log.d(TAG, "Hashmap 2: " + map2.values());
Log.d(TAG, "array 4: " + contactList);

}


Log.d(TAG, "array 5: " + contactList);

} catch (JSONException e) {
e.printStackTrace();
Log.e("JSON Parser", "Error parsing data " + e.toString());

}

if (readyToGo()) {
setContentView(R.layout.map_based);

SupportMapFragment mapFrag=
(SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.map2);
initListNav();

map=mapFrag.getMap();

CameraUpdate center= CameraUpdateFactory.newLatLng(new LatLng(my_lat , my_lng));

CameraUpdate zoom=CameraUpdateFactory.zoomTo(10);
map.moveCamera(center);
map.animateCamera(zoom);

for (HashMap<String, String> hashMap : contactList) {
map.addMarker(new MarkerOptions()
.position(new LatLng(Double.valueOf(hashMap.get(TAG_LAT)) , Double.valueOf(hashMap.get(TAG_LNG))))
.title(hashMap.get(TAG_ADDRESS))
.snippet(hashMap.get(TAG_NAME))

);
}

map.setInfoWindowAdapter(new PopupMapBasedAdapter(getLayoutInflater()));
map.setOnInfoWindowClickListener(this);

}

Button btn_web = (Button) findViewById(R.id.footer_list_btn);
btn_web.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//myVib.vibrate(50);
finish();
}
});
}

@Override
public boolean onNavigationItemSelected(int itemPosition, long itemId) {
map.setMapType(MAP_TYPES[itemPosition]);
return(true);
}

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
super.onSaveInstanceState(savedInstanceState);
savedInstanceState.putInt(STATE_NAV,getSupportActionBar().getSelectedNavigationIndex());
}

@Override
public void onInfoWindowClick(Marker marker) {

marker.getTitle();
marker.getSnippet();
}

@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
getSupportActionBar().setSelectedNavigationItem(savedInstanceState.getInt(STATE_NAV));
}

private void initListNav() {
ArrayList<String> items=new ArrayList<String>();
ArrayAdapter<String> nav=null;
ActionBar bar=getSupportActionBar();

for (int type : MAP_TYPE_NAMES) {
items.add(getString(type));
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
nav=
new ArrayAdapter<String>(
bar.getThemedContext(),
android.R.layout.simple_spinner_item,
items);
}
else {
nav=
new ArrayAdapter<String>(
this,
android.R.layout.simple_spinner_item,
items);
}

nav.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
bar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
bar.setListNavigationCallbacks(nav, this);
}


}

Answer

You cannot add anymore data to the marker, unless you all put it in the snippet.

So if you want to add more data to your marker, you will have to store it in an external variable which is linked to your marker.

Each made marker has an unique ID.

You can use this information to save any additional data mapped to this ID in a separate variable.

Example:

Create a variable you can access:

 /**
  * Create your variable where you store all your data mapped to the marker ID, 
  * make it accessible where you want.
  * The key of this hashmap is your marker ID, the value is another Map with extra data
  */
 HashMap<String, HashMap> extraMarkerInfo = new HashMap<String, HashMap>();

OPTION 1 Change your marker code so you add extra data to this variable

for (HashMap<String, String> hashMap : contactList) {
     // Create your marker like normal, nothing changes
     Marker marker = map.addMarker(new MarkerOptions()
         .position(new LatLng(Double.valueOf(hashMap.get(TAG_LAT)) , Double.valueOf(hashMap.get(TAG_LNG))))
         .title(hashMap.get(TAG_ADDRESS))
         .snippet(hashMap.get(TAG_NAME)));

     // When you created the marker you store the extra data from your JSON in another variable (HashMap for example)
     HashMap<String, String> data = new HashMap<String, String>();

     data.put(TAG_Location,hashMap.get(TAG_Location));
     data.put(TAG_Company,hashMap.get(TAG_Company));
     data.put(TAG_PLACE,hashMap.get(TAG_PLACE));
     data.put(TAG_POSTAL,hashMap.get(TAG_POSTAL));
     data.put(TAG_CITY,hashMap.get(TAG_CITY));
     data.put(TAG_MONDAY,hashMap.get(TAG_MONDAY));
     data.put(TAG_TUESDAY,hashMap.get(TAG_TUESDAY));
     data.put(TAG_WEDNESDAY,hashMap.get(TAG_WEDNESDAY));
     data.put(TAG_THURSDAY,hashMap.get(TAG_THURSDAY));
     data.put(TAG_FRIDAY,hashMap.get(TAG_FRIDAY));
     data.put(TAG_SATURDAY,hashMap.get(TAG_SATURDAY));
     data.put(TAG_SUNDAY,hashMap.get(TAG_SUNDAY));
     data.put(TAG_TYPE,hashMap.get(TAG_TYPE));
     data.put(TAG_NOCAR,hashMap.get(TAG_NOCAR));

     // Save this marker data in your previously made HashMap mapped to the marker ID. So you can get it back based on the marker ID
     extraMarkerInfo.put(marker.getId(),data);

}

EASY OPTION 2 Just save the entire map in the external variable

for (HashMap<String, String> hashMap : contactList) {
     // Create your marker like normal, nothing changes
     Marker marker = map.addMarker(new MarkerOptions()
         .position(new LatLng(Double.valueOf(hashMap.get(TAG_LAT)) , Double.valueOf(hashMap.get(TAG_LNG))))
         .title(hashMap.get(TAG_ADDRESS))
         .snippet(hashMap.get(TAG_NAME)));

     // Just save the entire json hashmap into the external variable
     extraMarkerInfo.put(marker.getId(),hashMap);

}

Now you can access that extraMarkerInfo whenever you want, you know the Marker id by using getID().

@Override
public void onInfoWindowClick(Marker marker) {

    String title = marker.getTitle();
    String snippet = marker.getSnippet(); 

    // Get extra data with marker ID
    HashMap<String, String> marker_data = extraMarkerInfo.get(marker.getId());

    // Getting the data from Map
    String location = marker_data.get(TAG_Location);
    String company = marker_data.get(TAG_Company);
    String place = marker_data.get(TAG_PLACE);
    //.. etc etc
}

This is just a small example using HashMaps, but you can use different solutions whatever you prefer.

Comments