Try this full example of custom marker.
Map Activity :
public void onMapReady(GoogleMap googleMap) {
mMap.clear();
LinearLayout tv2;
tv2 = (LinearLayout)MapsActivity.this.getLayoutInflater().inflate(R.layout.marker_dialog,
null, false);
tv2.measure(View.MeasureSpec.makeMeasureSpec(0,
View.MeasureSpec.UNSPECIFIED), View.MeasureSpec.makeMeasureSpec(0,
View.MeasureSpec.UNSPECIFIED));
tv2.layout(0, 0, tv2.getMeasuredWidth(), tv2.getMeasuredHeight());
tv2.setDrawingCacheEnabled(true);
tv2.buildDrawingCache();
Bitmap bm2 = tv2.getDrawingCache();
icon2 = BitmapDescriptorFactory.fromBitmap(bm2);
BitmapDescriptorFactory.fromResource(R.drawable.ic_markericon);
HashMap<Marker, JSONObject> stopsMarkersInfo = new HashMap<>();
JSONObject ObjectForMarker;
for (int i = 0; i < YourData.length(); i++)
{//YourData is JSONArray
LatLng coordinate = new LatLng(Latitude, Longitude);
ObjectForMarker = YourData.getJSONObject(i);
MarkerOptions markerOptions = new
MarkerOptions().position(coordinate).icon(Youricon);
Marker marker = mMap.addMarker(markerOptions);
stopsMarkersInfo.put(marker, ObjectForMarker);
}
googleMap.setInfoWindowAdapter(new StopsInfoWindow(stopsMarkersInfo, getApplicationContext()));
}
Custom Adapter Class :
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.TextView;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.model.Marker;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.HashMap;
public class StopsInfoWindow implements GoogleMap.InfoWindowAdapter {
private HashMap<Marker, JSONObject> stopsMarkersInfo;
private View view;
Context context;
public StopsInfoWindow(HashMap<Marker, JSONObject> stopsMarkersInfo, Context context) {
this.stopsMarkersInfo = stopsMarkersInfo;
this.context = context;
}
@Override
public View getInfoContents(Marker marker) {
return null;
}
@Override
public View getInfoWindow(final Marker marker) {
JSONObject stop = stopsMarkersInfo.get(marker);
if (stop != null) {
LayoutInflater inflater = (LayoutInflater) context.getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.item_stop_marker_info, null);
TextView iD = (TextView) view.findViewById(R.id.iD);
TextView Amount = (TextView) view.findViewById(R.id.Amount);
TextView Date = (TextView) view.findViewById(R.id.Date);
for (int i = 0; i < stopsMarkersInfo.size(); i++) {
}
try {
iD.setText(stop.getString("iD"));
Amount.setText(stop.getString("Amount"));
Date.setText(stop.getString("Date"));
} catch (JSONException e) {
e.printStackTrace();
}
}
return view;
}
}
marker_dialog.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/myMarker"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
android:orientation="vertical">
<ImageView
android:layout_width="50dp"
android:layout_height="60dp"
android:layout_gravity="center_horizontal"
android:src="@drawable/ic_markericon" />
</LinearLayout>
item_stop_marker_info.xml :
Declare all the options you want in your marker
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/roundlayout">
<TextView
android:id="@+id/iD"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_toRightOf="@+id/MName"
android:text="iD"
android:textColor="@color/background"
android:textSize="13dp" />
<TextView
android:layout_marginRight="10dp"
android:id="@+id/Amount"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Amount"
android:textColor="@color/background"
android:textSize="13dp" />
</RelativeLayout>