簡體   English   中英

Google Maps Marker Clustering?

[英]Google Maps Marker Clustering?

我正在嘗試添加從Firebase數據庫獲得的標記的聚類。 但是啟動地圖時,我的應用程序使錯誤崩潰:

java.lang.NullPointerException:嘗試從null對象引用上的字段“ double com.google.android.gms.maps.model.LatLng.longitude”讀取

這是我的MapActivity.java

public class MapActivity extends AppCompatActivity
        implements OnMapReadyCallback {

    private static final int DEFAULT_ZOOM = 15;
    private static final String TAG = MapActivity.class.getSimpleName();
    private LocationManager locationManager;
    private GoogleMap mMap;
    private ClusterManager<Marker> mClusterManager;
    private static final String EXTRA_MARKER_LIST = "EXTRA_MARKER_LIST";

    public static Intent getStartIntent(Context context, List<Marker> markerList) {
        Intent startIntent = new Intent(context, MapActivity.class);
        startIntent.putParcelableArrayListExtra(
               EXTRA_MARKER_LIST, new ArrayList<Marker>(markerList));
        return startIntent;
    }

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

        SupportMapFragment mapFragment =
                (SupportMapFragment) getSupportFragmentManager()
                        .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);
    }

    @Override
    public void onMapReady(final GoogleMap googleMap) {
        mMap = googleMap;
        LatLng lviv = new LatLng(49.838, 24.029);
        mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(lviv, 12));
        mClusterManager = new ClusterManager<Marker>(this, googleMap);

        googleMap.setOnCameraIdleListener(mClusterManager);
        googleMap.setOnMarkerClickListener(mClusterManager);
        addMarkers();
    }

    private void addMarkers() {
        List<Marker> markerList=getIntent().getParcelableArrayListExtra(EXTRA_MARKER_LIST);
        for(int i = 0; i < markerList.size(); i++) {
            Marker marker = markerList.get(i);
            Location location = marker.getLocation();
            mMap.addMarker(new MarkerOptions()
                    .position(new LatLng(location.getLatitude(), location.getLongitude()))
                    .title(marker.getName()));
            mClusterManager.addItem( marker);
        }
    }
}

這是我的模型類Marker.java

public class Marker implements Parcelable, ClusterItem {

    public String id;
    public String name;
    public String description;
    public String date;
    public Image image;
    public Location location;

    public Marker() {
    }

    protected Marker(Parcel in) {
        id = in.readString();
        name = in.readString();
        description = in.readString();
        date = in.readString();
        image = in.readParcelable(Image.class.getClassLoader());
        location = in.readParcelable(Location.class.getClassLoader());

    }
    public static final Creator<Marker> CREATOR = new Creator<Marker>() {
        @Override
        public Marker createFromParcel(Parcel in) {return new Marker(in);}
        @Override
        public Marker[] newArray(int size) {return new Marker[size];}
    };

    public String getDescription() {return description;}

    public String getId() {return id;}

    public String getDate(){return date;}

    public Image getImage() {return image;}

    public Location getLocation() {return location;}

    public String getName() {return name;}

    @Override
    public String toString() {
        return "Marker{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                ", description='" + description + '\'' +
                ", date='" + date + '\'' +
                ", image=" + image +
                ", location=" + location + '}';
    }

    @Override
    public int describeContents() {return 0;}

    @Override
    public void writeToParcel(Parcel parcel, int i) {
        parcel.writeString(id);
        parcel.writeString(name);
        parcel.writeString(description);
        parcel.writeString(date);
        parcel.writeParcelable(image, i);
        parcel.writeParcelable(location, i);
    }

    @Override
    public LatLng getPosition() {return null;}

    @Override
    public String getTitle() {return null;}

    @Override
    public String getSnippet() {return null;}
}

非常感謝您的關注。 希望有人能幫助我

您必須在Marker類(屬於ClusterItem接口的實現)中正確實現getPosition 當前,您的Marker類為getPosition返回null。

所以改變這個:

@Override
public LatLng getPosition() {return null;}

像這樣:

@Override
public LatLng getPosition() {
    return new LatLng(location.getLatitude(),location.getLongitude());
}

為此,請考慮實現其他接口方法getTitlegetSnippet

這些接口方法是ClusterManager從自定義類型參數中檢索信息的方式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM