アプリケーションのすべてのマーカーはユーザーを表すので、インターネットからデータを取得するために情報ウィンドウをクリックするときにそのユーザーを識別する必要があり、明白な理由で名前で識別することはできません。マーカーオブジェクトに追加の属性を追加することはできますか?ありがとう!
HashMap<Marker, User>
このチュートリアルを確認してください: http://bon-app-etit.blogspot.be/2012/12/add-informationobject-to-marker-in.html
マーカーオブジェクトに追加の属性を追加することはできますか?
いいえ。Marker
はfinal
です。また、作成したMarker
オブジェクトは、Google Play Servicesアプリの一部のIPCに対してのみ使用されます。取得したMarker
オブジェクトOnInfoWindowClickListener
で再構成されたコピーのようです。
スニペットフィールドにサブタイトルがあるので、それはオプションではありません。
もちろんそうだ。サブタイトルを別の場所に保存し、ユーザーのキーをサブタイトルに入れます。 InfoWindow
からInfoWindowAdapter
をレンダリングしたら、サブタイトルを引き出します。
マップを介してマーカーへの強い参照を維持することは良い考えだとは思いません。とにかくカスタムウィンドウアダプターを使用してコンテンツをレンダリングするので、MarkerOptionsのsnippet()またはtitle()を「乱用」して情報を保存できます。どちらも文字列であるため、格納する情報に応じてわずかに多くのメモリを使用しますが、反対側ではマーカーへの強い参照を保持することでメモリリークから安全になります。
また、停止および再開時にMapsが永続性を管理する方法と互換性があります。
以下は、私が実装した少し単純なソリューションです。行うことは、コンストラクターでウィンドウに渡したいものを受け取るInfoWindowAdapterを作成することだけです。
class CustomWindowAdapter implements InfoWindowAdapter{
LayoutInflater mInflater;
private HashMap<Marker, Double> mRatingHash;
public CustomWindowAdapter(LayoutInflater i, HashMap<Marker, Double> h){
mInflater = i;
mRatingHash = h;
}
@Override
public View getInfoContents(Marker marker) {
// Getting view from the layout file
View v = mInflater.inflate(R.layout.custom_info_window, null);
TextView title = (TextView) v.findViewById(R.id.tv_info_window_title);
title.setText(marker.getTitle());
TextView description = (TextView) v.findViewById(R.id.tv_info_window_description);
description.setText(marker.getSnippet());
RatingBar rating = (RatingBar) v.findViewById(R.id.rv_info_window);
Double ratingValue = mRatingHash.get(marker);
rating.setRating(ratingValue.floatValue());
return v;
}
@Override
public View getInfoWindow(Marker marker) {
// TODO Auto-generated method stub
return null;
}
}
情報ウィンドウに渡すデータはすべてあなたが責任を負いますが、評価のハッシュを渡していることがわかります。単なるプロトタイプであり、決して最良の解決策ではありませんが、これは誰もが始めるはずです。
追加のクラスを使用して、いくつかの情報と機能を各マーカーに関連付けています。これは最善のアプローチではないと思いますが、オプションです。特に、各マップマーカーに関連付けられている情報以上のものが必要な場合。これに使用する基本的な構造は次のとおりです。
// Make an array list of for all of your things
ArrayList<Thing> things;
class Thing {
long thing_key;
String thing_string;
int thingRadius;
Double coord_long;
Double coord_lat;
Marker marker;
}
// Then to use this to start your list.
things = new ArrayList<>();
// Create the thing object and save all the data
thing = new Thing();
thing.marker = thingMarker;
thing.thing_key = thing_key;
thing.thing_string = thing_string;
thing.radius = Integer.getInteger(thingRadius.getText().toString());
// Save the thing to the thing ArrayList
things.add(thing);