删除上一个路线并添加新路线

时间:2017-09-25 14:32:37

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

我有一个包含地图活动的应用程序,该活动包含来自我的SQLite数据库的大量标记以及连接这些标记的折线。
当我想在任何点击的标记和我的位置之间显示路线时,问题就出现了 问题是它工作正常并且第一次显示路线但是如果点击任何其他标记,则生成新路线而不删除先前路线。
我知道问题是以下代码。

@Override
protected void onPostExecute(List<List<HashMap<String, String>>> result) {
    ArrayList<LatLng> points = new ArrayList<>();
    PolylineOptions lineOptions = new PolylineOptions();
    for(int i=0;i<result.size();i++){
        List<HashMap<String, String>> path = result.get(i);
        for(int j=0;j<path.size();j++){
            HashMap<String,String> point = path.get(j);
            double lat = Double.parseDouble(point.get("lat"));
            double lng = Double.parseDouble(point.get("lng"));
            LatLng position = new LatLng(lat, lng);
            points.add(position);
        }
        lineOptions.addAll(points);
        lineOptions.width(5);
        lineOptions.color(Color.WHITE);
    }
      // googleMap.clear();
       //setMarkersPolyLines();
       googleMap.addPolyline(lineOptions);

}

到目前为止我的努力:

  1. 用Google搜索并找到了使用polyline.remove();的方法,但问题是如果放在addPolyline之后,那么新创建的路线也会被移除,如果放在那之前,则会出现错误,说折线可能未初始化。< / LI>
  2. 尝试if else as

    if(flag==0){
     polyline = googleMap.addPolyline(lineOptions);
     flag++;
    }
    else if(flag>0)
     polyline.remove();
     polyline = googleMap.addPolyline(lineOptions);
    }
    

    但什么也没发生。

  3. 尝试了这些步骤,但它会导致故障/波动,还有一些延迟。

      googleMap.clear();
      setMarkersPolyLines(); //setting all my markers again 
      googleMap.addPolyline(lineOptions); 
    
  4. Atlast,尝试在for循环中初始化pointslineoptions但是可能没有初始化错误,并且无法设置为null nullPointerException PolylineOptions无法设置为$input.params('querystringkey')

  5. 我尝试过很多帖子,但没有真正起作用。感谢。

2 个答案:

答案 0 :(得分:1)

我修改了Josef Adamcik的答案,它应该有效。

boolean isSecond = false;
private Polyline lastPolyline;    
@Override
protected void onPostExecute(List<List<HashMap<String, String>>> result) {
    ArrayList<LatLng> points = new ArrayList<>();
    PolylineOptions lineOptions = new PolylineOptions();
    for(int i=0;i<result.size();i++){
        List<HashMap<String, String>> path = result.get(i);
        for(int j=0;j<path.size();j++){
            HashMap<String,String> point = path.get(j);
            double lat = Double.parseDouble(point.get("lat"));
            double lng = Double.parseDouble(point.get("lng"));
            LatLng position = new LatLng(lat, lng);
            points.add(position);
        }
        lineOptions.addAll(points);
        lineOptions.width(5);
        lineOptions.color(Color.WHITE);
    }    
    if(isSecond) {
            lastPolyline.remove();
            lastPolyline = googleMap.addPolyline(lineOptions);
        }
        else
        {
            lastPolyline = googleMap.addPolyline(lineOptions);
            isSecond=true;
        }
}

答案 1 :(得分:0)

您应该保留对上次渲染中创建的折线的引用。此引用应该是您的类的字段。您应该在添加之前调用remove,但仅在lastPolyline不为null时调用。

private Polyline lastPolyline;

@Override
protected void onPostExecute(List<List<HashMap<String, String>>> result) {
    ArrayList<LatLng> points = new ArrayList<>();
    PolylineOptions lineOptions = new PolylineOptions();
    for(int i=0;i<result.size();i++){
        List<HashMap<String, String>> path = result.get(i);
        for(int j=0;j<path.size();j++){
            HashMap<String,String> point = path.get(j);
            double lat = Double.parseDouble(point.get("lat"));
            double lng = Double.parseDouble(point.get("lng"));
            LatLng position = new LatLng(lat, lng);
            points.add(position);
        }
        lineOptions.addAll(points);
        lineOptions.width(5);
        lineOptions.color(Color.WHITE);
    }
      // googleMap.clear();
       //setMarkersPolyLines();
    if (lastPolyline != null) {
        lastPolyline.remove();
    }  
    lastPolyline = googleMap.addPolyline(lineOptions);
}