区分Maps API v2中的不同标记(唯一标识符)

时间:2013-05-23 12:46:06

标签: android android-maps-v2

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

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

例如,如果我点击麦当劳市场,我希望能够知道我的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)));

现在点击这个,我继续下一页。下一页需要知道单击了WHICH对象,以便我可以将其他详细信息发送到该页面(例如,需要加载的图像URL等)。

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

5 个答案:

答案 0 :(得分:6)

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

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

onInfoWindowClick

CustomObj obj = map.get(marker);

另一种尝试是使用Android Maps Extensions,将getDatasetData方法添加到Marker,这样您就可以在创建标记和检索后分配CustomObj对象它在任何回调中。

答案 1 :(得分:1)

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

要找到正确的对象,我只需迭代它们:

for(SomeObject anObject : someObjects) {
    if(marker.getSnippet().equalsIgnoreCase(anObject.getID())) {
        //you got at match
    }
}

答案 2 :(得分:1)

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

Add Tag / Identifier to Markers

因此,对于HashMap,Marker的ID是Marker本身的一个更好的关键。

Map<String, MyObject> markerMap = new HashMap<String, MyObject>();
Marker marker = map.addMarker(...);
MyObject myObject = new MyObject();
markerMap.put(marker.getId(), myObject);

答案 3 :(得分: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的位置。你可以从那个位置获得数据。

希望它有所帮助...

答案 4 :(得分: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;
    }
});