【问题标题】:Android, How to remove all markers from Google Map V2?Android,如何从 Google Map V2 中删除所有标记?
【发布时间】:2013-05-27 00:47:16
【问题描述】:

我的片段中有地图视图。我需要刷新地图并根据条件添加不同的标记。所以,我应该在添加新标记之前从地图中删除最后一个标记。

实际上,几周前应用程序运行良好,但突然发生了。我的代码是这样的:

private void displayData(final List<Venue> venueList) {

        // Removes all markers, overlays, and polylines from the map.
        googleMap.clear();
.
.
.
}

上次运行良好(在 Android 团队在 2013 年 I/O 上宣布新的 Google Map API 之前)。然而,在那之后我调整了我的代码以使用这个新的 API。现在,我不知道为什么这种方法googleMap.clear(); 不起作用!

任何建议将不胜感激。谢谢

=======

更新

=======

完整代码:

private void displayData(final List<Venue> venueList) {

        // Removes all markers, overlays, and polylines from the map.
        googleMap.clear();

        // Zoom in, animating the camera.
        googleMap.animateCamera(CameraUpdateFactory.zoomTo(ZOOM_LEVEL), 2000, null);

        // Add marker of user's position
        MarkerOptions userIndicator = new MarkerOptions()
                .position(new LatLng(lat, lng))
                .title("You are here")
                .snippet("lat:" + lat + ", lng:" + lng);
        googleMap.addMarker(userIndicator);

        // Add marker of venue if there is any
        if(venueList != null) {
            for(int i=0; i < venueList.size(); i++) {
                Venue venue = venueList.get(i);
                String guys = venue.getMaleCount();
                String girls= venue.getFemaleCount();
                String checkinStatus = venue.getCan_checkin();
                if(checkinStatus.equalsIgnoreCase("true"))
                    checkinStatus = "Checked In - ";
                else
                    checkinStatus = "";

                MarkerOptions markerOptions = new MarkerOptions()
                        .position(new LatLng(Double.parseDouble(venue.getLatitude()), Double.parseDouble(venue.getLongitude())))
                        .title(venue.getName())
                        .snippet(checkinStatus + "Guys:" + guys + " and Girls:" + girls)
                        .icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_orange_pin));

                googleMap.addMarker(markerOptions);
            }
        }

        // Move the camera instantly to where lat and lng shows.
        if(lat != 0  && lng != 0)
            googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(lat, lng), ZOOM_LEVEL));

        googleMap.setInfoWindowAdapter(new GoogleMap.InfoWindowAdapter() {
            @Override
            public View getInfoWindow(Marker marker) {
                return null;
            }

            @Override
            public View getInfoContents(Marker marker) {
                return null;
            }
        });

        googleMap.setOnInfoWindowClickListener(new GoogleMap.OnInfoWindowClickListener() {
            @Override
            public void onInfoWindowClick(Marker marker) {
                String str = marker.getId();
                Log.i(TAG, "Marker id: " + str);
                str = str.substring(1);
                int markerId = Integer.parseInt(str);
                markerId -= 1; // Because first item id of marker is 1 while list starts at 0
                Log.i(TAG, "Marker id " + markerId + " clicked.");

                // Ignore if User's marker clicked
                if(markerId < 0)
                    return;

                try {
                    Venue venue = venueList.get(markerId);
                    if(venue.getCan_checkin().equalsIgnoreCase("true")) {
                        Fragment fragment = VenueFragment.newInstance(venue);
                        if(fragment != null)
                            changeFragmentLister.OnReplaceFragment(fragment);
                        else
                            Log.e(TAG, "Error! venue shouldn't be null");
                    }
                } catch(NumberFormatException e) {
                    e.printStackTrace();
                } catch(IndexOutOfBoundsException e) {
                    e.printStackTrace();
                }
            }
        });

【问题讨论】:

  • 好吧,我已经尝试过了,clear() 有效。你一定是做错了什么……
  • 我调用了这个方法两次。第一个没有问题。第二次这条线没有清除标记并向地图添加新标记(与旧标记一起)。所以,我对正在发生的事情感到困惑。
  • 感谢您的确认。我会尝试再次检查,也许你是对的,我做错了什么:(

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


【解决方案1】:

好吧,我终于找到了一种替代方法来解决我的问题。有趣的问题是,当您为地图分配标记时,它的 id 是“m0”。当您从地图中删除它并分配新标记时,您希望 id 应该是“m0”,但它是“m1”。因此,它向我表明该 id 是不可信的。所以我在片段的onActivityCreated() 的某处定义了List&lt;Marker&gt; markerList = new ArrayList&lt;Marker&gt;();

然后将上面的代码更改为以下代码。如果他们有类似的标记问题,希望它可以帮助其他人。

private void displayData(final List<Venue> venueList) {
        Marker marker;

        // Removes all markers, overlays, and polylines from the map.
        googleMap.clear();
        markerList.clear();

        // Zoom in, animating the camera.
        googleMap.animateCamera(CameraUpdateFactory.zoomTo(ZOOM_LEVEL), 2000, null);

        // Add marker of user's position
        MarkerOptions userIndicator = new MarkerOptions()
                .position(new LatLng(lat, lng))
                .title("You are here")
                .snippet("lat:" + lat + ", lng:" + lng);
        marker = googleMap.addMarker(userIndicator);
//        Log.e(TAG, "Marker id '" + marker.getId() + "' added to list.");
        markerList.add(marker);

        // Add marker of venue if there is any
        if(venueList != null) {
            for (Venue venue : venueList) {
                String guys = venue.getMaleCount();
                String girls = venue.getFemaleCount();
                String checkinStatus = venue.getCan_checkin();
                if (checkinStatus.equalsIgnoreCase("true"))
                    checkinStatus = "Checked In - ";
                else
                    checkinStatus = "";

                MarkerOptions markerOptions = new MarkerOptions()
                        .position(new LatLng(Double.parseDouble(venue.getLatitude()), Double.parseDouble(venue.getLongitude())))
                        .title(venue.getName())
                        .snippet(checkinStatus + "Guys:" + guys + " and Girls:" + girls)
                        .icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_orange_pin));

                marker = googleMap.addMarker(markerOptions);
//                Log.e(TAG, "Marker id '" + marker.getId() + "' added to list.");
                markerList.add(marker);
            }
        }

        // Move the camera instantly to where lat and lng shows.
        if(lat != 0  && lng != 0)
            googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(lat, lng), ZOOM_LEVEL));

        googleMap.setInfoWindowAdapter(new GoogleMap.InfoWindowAdapter() {
            @Override
            public View getInfoWindow(Marker marker) {
                return null;
            }

            @Override
            public View getInfoContents(Marker marker) {
                return null;
            }
        });

        googleMap.setOnInfoWindowClickListener(new GoogleMap.OnInfoWindowClickListener() {
            @Override
            public void onInfoWindowClick(Marker marker) {
                int markerId = -1;

                String str = marker.getId();
                Log.i(TAG, "Marker id: " + str);
                for(int i=0; i<markerList.size(); i++) {
                    markerId = i;
                    Marker m = markerList.get(i);
                    if(m.getId().equals(marker.getId()))
                        break;
                }

                markerId -= 1; // Because first item of markerList is user's marker
                Log.i(TAG, "Marker id " + markerId + " clicked.");

                // Ignore if User's marker clicked
                if(markerId < 0)
                    return;

                try {
                    Venue venue = venueList.get(markerId);
                    if(venue.getCan_checkin().equalsIgnoreCase("true")) {
                        Fragment fragment = VenueFragment.newInstance(venue);
                        if(fragment != null)
                            changeFragmentLister.OnReplaceFragment(fragment);
                        else
                            Log.e(TAG, "Error! venue shouldn't be null");
                    }
                } catch(NumberFormatException e) {
                    e.printStackTrace();
                } catch(IndexOutOfBoundsException e) {
                    e.printStackTrace();
                } catch (NullPointerException e) {
                    e.printStackTrace();
                }
            }
        });
    }

【讨论】:

  • 如何在不使用clear() 方法的情况下从ArrayListMarkerArray 中删除所有标记
【解决方案2】:

如果您想清除“地图上的所有标记、叠加层和折线”,请在您的 GoogleMap 上使用clear()

【讨论】:

  • 热烈欢迎亲爱的 Ahmad 加入 StackOverflow。为了防止投票失败,请在回答问题之前阅读其他答案,尤其是接受的答案。
  • 它帮助 Stackoverflow 的数据库不被重复的答案所淹没。谢谢。
【解决方案3】:

使用map.clear()从谷歌地图中删除所有标记

【讨论】:

    【解决方案4】:

    假设有 2 个位置的 ArrayList。现在,您根据该数组在地图上显示标记。会有两个标记。当您单击第一个标记时,它会给您一个标记索引m0,第二个是m1

    假设您刷新了位置数组,现在您得到了一个包含 3 个位置的数组。你有3个标记。但是当你点击第一个时,它会给你标记索引m2(好像它从第一个位置箭头继续计数)第二个是m3,第三个是m4。您真正想要的是将其设为m0m1m2

    现在,当您构建位置数组时,您可能会调用location.add("you location")...,当您重建它(刷新它)时,您首先调用location.clear(),然后再次构建它。

    解决方案:

    首先,制作另一个类似于位置数组的虚拟数组,并在for 循环中与真实位置数组一起构建它:locaionDummy.add(i) 但你永远不要刷新它 - 那样不断建设,你会知道你从一开始就有多少个地点。

    其次,使用mIndex 作为int 变量做这样的事情(设置图像的示例):

    void locatePins() {  
    
    mIndex = locationDummy.size()-location.size();
    
    for (int i = 0; i < userID.size(); i++) {
    
        LatLng pgLocation = new LatLng(Double.parseDouble(latArr.get(i)), Double.parseDouble(lngArr.get(i)));
    
        myMap.setInfoWindowAdapter(new GoogleMap.InfoWindowAdapter() {    
            @Override
            public View getInfoWindow(Marker marker) {
    
            View view = getLayoutInflater().inflate(R.layout.map_marker_info, null);
    
            RelativeLayout markerInfo= view.findViewById(R.id.markerInfo);
            TextView name = view.findViewById(R.id.userName);
            TextView details = view.findViewById(R.id.userInfo);
            ImageView img = view.findViewById(R.id.userImg);
    
            name.setText(marker.getTitle());
            details.setText(marker.getSnippet());
    
            img.setImageBitmap (bmImg.get(Integer.parseInt(marker.getId().replaceAll("[^\\d.]", ""))-mIndex));
    
            return view;
        }
    
        @Override
        public View getInfoContents(Marker marker) {
    
             return null;
        }   
    
        // ... the rest of the code 
    }
    }
    

    关键是从locationDummy.size() 中减去真正的location.size() 得到一个数字int mIndex,您稍后将从marker.getId() 中减去该数字

    【讨论】:

      【解决方案5】:

      如果您只需要删除标记,而将其他东西(例如地面覆盖物等)留在那里,请使用:

       marker.remove();
      

      或者如果你有很多:

       if(markers!=null&&mMap!=null){                          
            for(int i=0;i<markers.size();i++){                
                   markers.get(i).remove();
            }
       }
      

      在哪里

      List<Marker> markers = new ArrayList<>();
      

      【讨论】:

        猜你喜欢
        • 2016-10-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-15
        • 2015-02-13
        • 2013-06-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多