web-dev-qa-db-ja.com

Google Maps v2でIDを使用してマップマーカーを取得する

基本的に、マーカーをマップに追加すると、新しいマーカーが返され、マーカーIDをマップから取得できます。

Marker m = map.addMarker(new MarkerOptions()
                            .position(new LatLng(lat,lon)));
String id = m.getId();

多くのマーカーがあり、マーカーを削除したい場合、IDでマーカーを取得する方法はありますか?

17
tyczj

問題は、マーカーIDが自動的に生成され、マーカーを個別に追跡するために使用できないことです。これを回避するいくつかの戦略が提案されています。 1つは ハッシュマップを使用してマーカーを追跡する を選択し、特定のマーカーを見つけて削除するために選択したキーを使用することです。別のアイデアは、スニペットなどのマーカーフィールドの1つをオーバーロードして、自分でキーを追加することです。たとえば、(Googleのサンプルコードを使用して)新しいマーカーを作成する場合、独自のキー文字列をスニペットフィールドに入力できます。

mMap.addMarker(new MarkerOptions()                           
.position(MELBOURNE)                           
.title("Melbourne")                           
.snippet(KEY + "Population: 4,137,400"));

後でそのキーを取得することができます

String s = marker.getSnippet()
String key = s.substring(start, end)

次に、条件を使用して、一致する場合は特定のマーカーを削除します。あるアプローチを実行するために必要なことに応じて、別のアプローチよりも簡単で効率的です。

21
Rarw

私はこのようにしました:

変数の初期化

private GoogleMap mMap;
private HashMap<Marker, Integer> mHashMap = new HashMap<Marker, Integer>();
private ArrayList<MyCustomModelClass> myList = new ArrayList<MyCustomModelClass>();

マーカーを追加 on google map using your arraylist

for (int i = 0; i < myList.size(); i++) {
    double latitude = myList.getLatitude();
    double longitude = myList.getLongitude();
    Marker marker = mMap.addMarker(new MarkerOptions().position(new LatLng(latitude,longitude))).title(myList.getTitle())
                                        .icon(BitmapDescriptorFactory.fromResource(R.drawable.location_icon));
    mHashMap.put(marker, i);
}  

オンマーカークリックリスナー

@Override
public boolean onMarkerClick(Marker marker) { 
    int pos = mHashMap.get(marker);
    Log.i("Position of arraylist", pos+"");
}

これがお役に立てば幸いです。

39
Hiren Patel

私は知っています、とても遅いです。しかし今は、一意の[〜#〜]タグ[〜#〜]をマーカーに直接追加できます。

Marker marker = mMap.addMarker(markerOptions);
marker.setTag("");

Google開発者はマップマーカーTAGについてリンクしています

6
Ashish John

使用する WeakHashMap<Integer,Marker>この方法では、マーカーへの参照をメモリに保持せず、ガベージコレクションされたマーカーについて心配する必要がないため、マーカーを格納します。

2番目に推奨される方法は、IDとカスタムデータを含むWeakHashMapを作成することです。ドキュメントには、マーカーオブジェクトは変更される可能性があるため、マーカーをキーとして使用しないでください。アクティビティが強制終了されて復元されたが、IDは同じままの場合。マーカーオブジェクトが変更された場合もnullを返すことがあります。

WeakHashMap<Integer,Marker> obj = new WeakHashMap <Integer,Marker>();

今後の視聴者のお役に立てれば幸いです...

4
Wasim K. Memon

これを行う最善の方法は、Map <int, Mark> dictionaryMark;

マークを描くたびに辞書にマークを追加するだけです。

0
AbelMorgan