从对象的arraylist创建一个hashmap并将地图标记附加到它们

时间:2013-08-21 08:08:35

标签: android google-maps google-maps-markers infowindow

我有以下问题:

我有一个对象的arraylist,我希望为每个标记的信息窗口创建标记并填充一些数据。

private ArrayList<Ad> _items = new ArrayList<Ad>();

从包含该信息的db填充。

我是java和android开发的新手,所以我很难找到解决方案。

我在想创建一个HashMap<Marker , Ad>

但我真的不知道这是否是最好的解决方案,或者如何实现它。

任何想法?

谢谢。

1 个答案:

答案 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);
            }
        });
    }
}

希望这能让你知道该怎么做:) 如果您需要更多帮助,请告诉我