刷新 google 地图时清除所有标记 - Android

Clear all markers when refresh google maps - Android

我想在刷新地图时删除所有标记并删除 setInfoWindowAdapter。但是如果我刷新它,应用程序会崩溃。

这是我的代码

private final BroadcastReceiver mNetworkReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {

        ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
        if (activeNetwork != null) { // connected to the internet
            if (activeNetwork.getType() == ConnectivityManager.TYPE_WIFI) {
                // connected to wifi
                //Toast.makeText(context, activeNetwork.getTypeName(), Toast.LENGTH_SHORT).show();
                new GetInfo().execute(Config.INFO_URL);
            } else if (activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE) {
                // connected to the mobile provider's data plan
                //Toast.makeText(context, activeNetwork.getTypeName(), Toast.LENGTH_SHORT).show();
                new GetInfo().execute(Config.INFO_URL);
            }
        }
    }
};

class GetInfo extends AsyncTask<String, Void, Boolean> {
    ProgressDialog dialog;

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        dialog = new ProgressDialog(MapsActivity.this);
        dialog.setMessage("Mohon tunggu");
        dialog.setTitle("Mendapatkan data...");
        dialog.show();
        dialog.setCancelable(true);
    }

    @Override
    protected Boolean doInBackground(String... urls) {
        array.clear();
        mMarkersHashMap.clear();
        mMyMarkersArray.clear();
        markerPoints.clear();
        targets.clear();

        try {
            HttpGet httppost = new HttpGet(urls[0]);
            HttpClient httpclient = new DefaultHttpClient();
            HttpResponse response = httpclient.execute(httppost);
            int status = response.getStatusLine().getStatusCode();
            if (status == 200) {

                HttpEntity entity = response.getEntity();
                String data = EntityUtils.toString(entity);
                JSONObject jsono = new JSONObject(data);

                JSONArray konten = jsono.getJSONArray("konten");
                mMarkersHashMap = new HashMap<Marker, MyMarker>();

                for (int i = 0; i < konten.length(); i++) {
                    HashMap<String,String> newMap=new HashMap<String,String>();
                    JSONObject object = konten.getJSONObject(i);
                    newMap.put("nama", object.getString("nama"));
                    newMap.put("deskripsi",object.getString("deskripsi"));
                    newMap.put("foto",object.getString("foto"));
                    newMap.put("marker", object.getString("marker"));
                    newMap.put("lat",object.getString("lat"));
                    newMap.put("lng",object.getString("lng"));
                    array.add(newMap);
                }

                return true;
            }

        } catch (ParseException e1) {
            e1.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return false;
    }

    protected void onPostExecute(final Boolean result) {
        dialog.cancel();
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                if (!result) {
                    //Toast.makeText(getApplicationContext(), "Tidak dapat mengambil data dari server, silahkan cek koneksi internet anda", Toast.LENGTH_LONG).show();
                    showInfo();
                }
                else {
                    for (int i = 0; i < array.size(); i++) {
                        HashMap<String, String> newMap = new HashMap<String, String>();
                        newMap = array.get(i);
                        mMyMarkersArray.add(new MyMarker(newMap.get("nama"), newMap.get("deskripsi"), newMap.get("foto"), newMap.get("marker"), Double.parseDouble(newMap.get("lat")), Double.parseDouble(newMap.get("lng"))));
                    }
                    plotMarkers(mMyMarkersArray);
                }
                }
        });

    }
}

这是 plotMarkers

public void plotMarkers(ArrayList<MyMarker> markers) {
    if(markers.size() > 0) {
        for (MyMarker myMarker : markers)
        {
            dest = new LatLng(myMarker.getmLatitude(), myMarker.getmLongitude());
            markerOption = new MarkerOptions().position(dest);
            location_marker = mMap.addMarker(markerOption);
            Target target = new PicassoMarker(location_marker);
            targets.add(target);

            ImageView image = new ImageView(this);
            image.setImageResource(R.mipmap.marker);
            int width = image.getDrawable().getIntrinsicWidth();
            int height = image.getDrawable().getIntrinsicHeight();

            Picasso.with(MapsActivity.this).load(myMarker.getmIcon()).resize(width, height).onlyScaleDown().into(target);
            mMarkersHashMap.put(location_marker, myMarker);

            i = getIntent();
            if(i.getBooleanExtra("maps", true)) {
                location_marker.setTitle(i.getStringExtra("nama"));
                mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(dest, 16));
            }
            else {
                mMap.setInfoWindowAdapter(new MarkerInfoWindowAdapter());
            }
        }
    }
}

这是操作栏上的刷新菜单

case R.id.action_refresh:
    registerReceiver(mNetworkReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
return true;

我的代码有什么问题?

我假设您仍然有以前的类似实现.. 为了删除所有 Markers。您可以只在标记实例上调用 Marker.remove() 。在您的例子中,您将标记实例放在 HashMap 中。所以你可以做的是这样的:

private void removeAllMarkers() {
        // hmap here is the HashMap you have.
        for (HashMap.Entry<Marker, MyMarker> entry : hmap.entrySet()) {
            entry.getKey().remove();
        }
    }

这会遍历 HashMap,您在 plotMarkers 函数中添加 Marker 并将它们全部删除。只需在刷新 Map.

的代码中调用此函数即可

关于您对 setInfoWindowAdapter 的关注,如果您与 MarkerInfoWindow 有关,我认为只要您能够删除 [=11] =] 本身,你将不再有问题。

发现显示 how to remove a marker. I think this post on iterating over hashmaps 的答案对您也有帮助。