我有以下问题:
我有一个对象的arraylist,我希望为每个标记的信息窗口创建标记并填充一些数据。
private ArrayList<Ad> _items = new ArrayList<Ad>();
从包含该信息的db填充。
我是java和android开发的新手,所以我很难找到解决方案。
我在想创建一个HashMap<Marker , Ad>
但我真的不知道这是否是最好的解决方案,或者如何实现它。
任何想法?
谢谢。答案 0 :(得分:0)
我目前正在制作地图应用,我实施的最佳解决方案是:
1)创建一个执行以下操作的AsyncTask: a)从数据库中检索数据 - 例如。位置,图标,名称,Snipper等 b)然后创建标记
c)添加标记。
所有这一切将会创建一个新的工作线程(它在后台运行 - 与你的UI线程分开)所以如果你有一个大型数据库并且需要添加100个(如果不是1000个)标记,那么可能需要几分钟,你不想在你的UI线程上执行此操作,因为它将被阻止。
如果您需要帮助,请告诉我。
修改强>
在活动中,按以下方式调用新任务:
您可以根据需要将尽可能多的参数传递给AsyncTask。它们可以是任何类型的对象。例如。字符串,int,Map。
for“map”会将GoogleMap map = (GoogleMap) findViewById(...);
引用传递给它
new AddMarkersAsyncTask(getApplicationContext()).execute(map, param1, param2, etc...);
您的AsyncTask应如下所示: AddMarkersAsyncTask.class
public class AddMarkersAsyncTask extends AsyncTask<Object, Void, Void> {
static Context mContext;
public AddMarkersAsyncTask(Context mContext) {
this.mContext = mContext;
}
@Override
protected Void doInBackground(Object... params) {
// Here you retrieve all the params like this
// You will need to add Cast to each param as they are all passed as generic object.
GoogleMap map = (GoogleMap) params[0];
String[] a = (String[]) params[1];
int airport_marker_w = (Integer) params[2];
int airport_marker_h = (Integer) params[3];
... etc etc
// Here retrieve all your database data
String tile = "Title";
String snippet = "Snippet";
Bitmap icon = BitmapFactory.decodeFromResource(R.drawable.my_marker);
LatLnt position = <SomePosition>;
// If your array list or length of markers is say 50 markers, do a for loop with either i < listname.length or i < listname.size() or i < 50, etc etc
for(int i=0; i < a.length; i++) {
new AddMarker(mContext).addMarker(map, title, snippet, icon, position);
}
return null;
}
}
然后创建另一个类AddMarker: AddMarker.class
public class AddMarker {
static Context mContext;
public AddMarker(Context mContext) {
this.mContext = mContext;
}
public int addMarker(final GoogleMap map,String title, String snippet, Bitmap icon) {
final MarkerOptions opts = new MarkerOptions();
Handler handler = new Handler(Looper.getMainLooper());
opts.title(title);
opts.snippet(snippet);
opts.position(position);
opts.icon(icon);
handler.post(new Runnable() {
public void run() {
map.addMarker(opts);
}
});
}
}
希望这能让你知道该怎么做:) 如果您需要更多帮助,请告诉我