1
votes

I am trying to create a customised view of my Info Window for which I have made a layout file. But my data(Lattitude and Longitude ) are in the form a ArrayList.

for (int i = 0; i < list.size(); i++) {
            Log.e(getClass().getName(), list.get(i).getFirstName());
            double x = list.get(i).getLocationLatLon().getLat();
            double y = list.get(i).getLocationLatLon().getLon();
            if (x > 90 || x < -90 || y < -180 || y > 180) {
                Log.e(getClass().getName(),
                        "out of range " + Double.toString(x) + "  "
                                + Double.toString(y));
                lng2 = new LatLng(lat, lng);
            } else {
                Log.e(getClass().getName(),
                        "In range " + Double.toString(x) + "  "
                                + Double.toString(y));
                lng2 = new LatLng(x, y);
            }

            InfoClass infoClass= new InfoClass();
            infoClass.setName(list.get(i).getFirstName()+" "+list.get(i).getLastName());
            infoClass.setCharge(list.get(i).getCharge());
            infoClass.setAvailableTime(list.get(i).getTimeAvailable());
            infoClass.setServiceCategory(list.get(i).getCategoryName());
            infoClass.setServiceName(list.get(i).getServiceName());
            finalist.add(infoClass);

            theMap.addMarker(new MarkerOptions()
                    .title(list.get(i).getServiceName())
                    .position(lng2)
                    .icon(BitmapDescriptorFactory
                            .fromResource(entertainment))
                    .snippet(list.get(i).getFirstName() + " "+ list.get(i).getLastName()) );


            theMap.setOnInfoWindowClickListener(this);
        }

I am setting my markers according the Latitudes and Longitude in my list and adding the required information to an ArrayList of class InfoClass. Now when I set setInfoWindowAdapter and pass finalist to my implementation of InfoWindowAdapter.

theMap.setInfoWindowAdapter(new InfoWindow(this, finalist));

my InfoWindow class

public class InfoWindow implements InfoWindowAdapter {

private final View myContentsView;
private LayoutInflater mInflator;
ArrayList<InfoClass> list;

public InfoWindow(Context context, ArrayList<InfoClass> list) {
    //Context context = new MainActivity().getApplicationContext();
    Context context2= context;
    mInflator = LayoutInflater.from(context2);
    this.list= list;
    myContentsView = mInflator.inflate(R.layout.info_view, null);
}


@Override
public View getInfoWindow(Marker marker) {

    return myContentsView;      
}


@Override
public View getInfoContents(Marker arg0) {
    return null;
}   

}

Now here in getInfoWindow method how do I get the get the information for a particular marker as each marker needs to display separate information based on its Location .

1

1 Answers

0
votes

Try this,

WindowLayout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <TextView
        android:id="@+id/tv_lat"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <TextView
        android:id="@+id/tv_lng"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

MainActivity.java

public class MainActivity extends FragmentActivity {


GoogleMap googleMap;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

// Getting reference to the SupportMapFragment of activity_main.xml
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);

// Getting GoogleMap object from the fragment
googleMap = mapFragment.getMap();

// Setting a custom info window adapter for the google map
googleMap.setInfoWindowAdapter(new InfoWindowAdapter() {

    // Use default InfoWindow frame
    @Override
    public View getInfoWindow(Marker arg0) {
        return null;
    }

    // Defines the contents of the InfoWindow
    @Override
    public View getInfoContents(Marker arg0) {

        // Getting view from the layout file info_window_layout
        View v = getLayoutInflater().inflate(R.layout.windowlayout, null);

        // Getting the position from the marker
        LatLng latLng = arg0.getPosition();

        // Getting reference to the TextView to set latitude
        TextView tvLat = (TextView) v.findViewById(R.id.tv_lat);

        // Getting reference to the TextView to set longitude
        TextView tvLng = (TextView) v.findViewById(R.id.tv_lng);

        // Setting the latitude
        tvLat.setText("Latitude:" + latLng.latitude);

        // Setting the longitude
        tvLng.setText("Longitude:"+ latLng.longitude);

        // Returning the view containing InfoWindow contents
        return v;

    }
});

// Adding and showing marker while touching the GoogleMap
googleMap.setOnMapClickListener(new OnMapClickListener() {

    @Override
    public void onMapClick(LatLng arg0) {
        // Clears any existing markers from the GoogleMap
        googleMap.clear();

        // Creating an instance of MarkerOptions to set position
        MarkerOptions markerOptions = new MarkerOptions();

        // Setting position on the MarkerOptions
        markerOptions.position(arg0);

        // Animating to the currently touched position
        googleMap.animateCamera(CameraUpdateFactory.newLatLng(arg0));

        // Adding marker on the GoogleMap
        Marker marker = googleMap.addMarker(markerOptions);

        // Showing InfoWindow on the GoogleMap
        marker.showInfoWindow();

    }
});

}
}

In this way you can create custom Layout and achieve the way you want to do.

Let me know if it helps you.