简体   繁体   中英

Customised view of InfoWindow for a list of markers in Google Maps V2 Android

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 .

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM