6

我有一个自定义类的 ArrayList。列表中大约有 10 个对象,每个对象都有 Title、Snippet、LatLng 等详细信息。我已经通过使用我的自定义类函数(如 getTitle、getSnippet、getLatLng 等)成功地将所有 10 个添加到地图中。

现在,当我单击(标记的)信息窗口时,我希望能够以某种方式知道该标记对应于我的自定义类的哪个对象。

例如,如果我单击麦当劳市场,我希望能够知道该标记属于我的 ArrayList 中的哪个项目。

我一直在查看 MarkerOptions 并且似乎没有任何东西可以用来识别相关的自定义对象。

如果这个问题太令人困惑,让我简单地说:

ArrayList<CustomObj> objects = blah
map.addMarker(new MarkerOptions().position(new LatLng(
                            Double.parseDouble(result.get(i).getCompanyLatLng()
                                    .split(",")[0]), Double.parseDouble(result
                                    .get(i).getCompanyLatLng().split(",")[1])))
                                    .title(result.get(i).getCompanyName())
                                    .snippet(result.get(i).getCompanyType())
                                    .icon(BitmapDescriptorFactory
                                            .fromResource(R.drawable.pin)));

现在,当单击此按钮时,我将进入下一页。下一页需要知道单击了哪个对象,以便我可以将其他详细信息发送到该页面(例如,需要加载的图像 URL 等)。

如何向我的标记添加唯一整数或任何标识符?

4

5 回答 5

6

一种正确的方法是使用Map<Marker, CustomObj>which 存储所有标记:

Marker marker = map.addMarker(...);
map.put(marker, result.get(i));

并在onInfoWindowClick

CustomObj obj = map.get(marker);

另一种尝试是使用Android Maps Extensions,它添加getDatasetData方法 to Marker,因此您可以在创建标记后分配您的CustomObj对象并在任何回调中检索它。

于 2013-05-23T19:28:33.990 回答
1

我使用片段文本来保存唯一 ID。如果您需要该片段,它将用于弹出窗口,您可以在其中制作自己的(通过从 ID 中查找对象),这样您就不会错过它,但您肯定会错过用于识别对象的唯一 ID。

为了找到正确的对象,我只是遍历它们:

for(SomeObject anObject : someObjects) {
    if(marker.getSnippet().equalsIgnoreCase(anObject.getID())) {
        //you got at match
    }
}
于 2013-05-23T12:49:25.590 回答
1

根据以下链接的讨论, Marker.equals 和 Marker.hashCode 有时不起作用。例如,当地图平移或缩放,或者重新启动/恢复时。

将标签/标识符添加到标记

所以 Marker 的 ID 对于 HashMap 来说是比 Marker 本身更好的键。

Map<String, MyObject> markerMap = new HashMap<String, MyObject>();
Marker marker = map.addMarker(...);
MyObject myObject = new MyObject();
markerMap.put(marker.getId(), myObject);
于 2014-08-01T14:56:01.893 回答
0

我认为使用纬度和经度,这可以做到

map.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {

        @Override
        public boolean onMarkerClick(final Marker marker) {
            LatLng pos = marker.getPosition();
            int arryListPosition = getArrayListPosition(pos);
            return true;
        }
    });

方法getArrayListPosition

private int getArrayListPosition(LatLng pos) {
    for (int i = 0; i < result.size(); i++) {
        if (pos.latitude == result.get(i).getCompanyLatLng().split(",")[0]) {
            if (pos.longitude == result.get(i).getCompanyLatLng()
                    .split(",")[1])
                return i;
        }
    }
    return 0;
}

此方法将返回您单击的ArrayList人的位置。Marker你可以从那个位置获取数据。

希望能帮助到你...

于 2013-05-23T13:01:17.383 回答
0

我迟到了 4 年才回答,但我真的很惊讶为什么没有人谈论marker.setTagmarker.getTag方法。

正如谷歌 API 文档中所写,

这比单独存储更容易Map<Marker, Object>

他们已经引入setTaggetTag避免使用Map<...>. 您可以按照以下方式使用它。

Marker marker = map.addMarker(...);
marker.setTag(result.get(i));  //Store your marker information here.

//To fetch your object...
map.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
    @Override
    public boolean onMarkerClick(Marker marker) {
        CustomObj obj = (CustomObj)marker.getTag();
        //Your click handle event
        // Pass the obj to another activity and you are done
        return false;
    }
});
于 2017-06-09T19:13:52.273 回答