移动标记而不重新加载android中的地图

时间:2014-06-04 07:23:35

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

我的应用有多个位置保存在列表中(当前导航抽屉列表)。当用户单击每个列表行时,它将在Google Map上显示片段中的相应位置。 因此,当我点击每个列表行时,每次都会加载地图片段,这需要花费时间并消耗资源。

他们有什么方法可以避免这种情况。(即当我点击每个列表行时,它只会加载标记后跟列表位置内容,而不会一次又一次地重新加载地图。)

在我的Activity中,我在每个列表单击上调用此方法。

private void displayView(int position) {
    ChildrenLocationDetails collection = result.get(position);      
    Fragment frag = newInstance(collection.getLatitude(), collection.getLongitude());
    getFragmentManager().beginTransaction().replace(R.id.container, frag).commit();  
}

我的newInstance()方法将数据发送到Fragment:

public static MapFragment newInstance(double latitude, double longitude) {
    MapFragment f = new MapFragment();
    Bundle args = new Bundle();
    args.putDouble(KEY_LON, longitude);
    args.putDouble(KEY_LAT, latitude);
    f.setArguments(args);
    return f;
}

在我的Mapfragment中我收集所有信息并使用位置标记加载地图。

谢谢。

2 个答案:

答案 0 :(得分:1)

每次都可以创建包含Map的Fragment的一个实例,而不是每次都替换它而不是替换它,而只是使用hide的{​​{1}}和show方法}。在地图片段中创建一个方法,为FragmentTransaction创建标记,并在向其添加标记时调用它。

示例:

创建Fragment的全局实例

GoogleMap
displayView

中的

private Fragment frag;

如果你想隐藏片段

private void displayView(int position) {
  ChildrenLocationDetails collection = result.get(position);      
  if(frag == null)
  {
       Fragment frag = newInstance(collection.getLatitude(), collection.getLongitude());
       getFragmentManager().beginTransaction().add(R.id.container, frag).commit(); 
  }else
  {
       frag.createMarker(collection.getLatitude(), collection.getLongitude());
       getFragmentManager().beginTransaction().show(frag).commit();
  }

}

这样你就不需要再次重新加载地图了。

答案 1 :(得分:1)

是肯定的。正如Rod_Algonquin所说,您只需要隐藏并显示FragmentTransaction并调用片段的用户定义方法来加载标记。

如果我稍微修改它并以友好的方式帮助你,那么它应该会更有帮助。

在这里你也可以借助SharedPreferences。只需将更改后的位置保存在else部分中,然后将其置于片段的方法中。

就像罗德在你的活动中所做的那样做一点改变。就像:

    private void displayView(int position) {
    ChildrenLocationDetails collection = result.get(position);      
    if(frag == null){
        frag = newInstance(collection.getLatitude(), collection.getLongitude());
        getFragmentManager().beginTransaction().replace(R.id.container, frag).commit();  
    }
    else{
        SharedPreferences mPreferences = getSharedPreferences("LOCATION", 0);
        Editor mEditor = mPreferences.edit();
        mEditor.putString(KEY_LAT, String.valueOf(collection.getLatitude()));
        mEditor.putString(KEY_LON, String.valueOf(collection.getLongitude()));
        mEditor.commit();
        MapFragment.ChangeMarkerPosition(this);
    }       
}

在你的片段中ChangeMarkerPosition()就像这样:

    public static void ChangeMarkerPosition(Context context){
    SharedPreferences mPreferences = context.getSharedPreferences("LOCATION", 0);
    double latitude = Double.parseDouble(mPreferences.getString(History.KEY_LAT, "0.0"));
    double longitude = Double.parseDouble(mPreferences.getString(History.KEY_LON, "0.0"));

      LatLng latLng = new LatLng(latitude, longitude);
      marker = map.addMarker(new MarkerOptions().position(latLng));
        // Showing the current location in Google Map
      map.moveCamera(CameraUpdateFactory.newLatLng(latLng));

        // Zoom in the Google Map
      map.animateCamera(CameraUpdateFactory.zoomTo(15));
}

请记住将Map和Marker变量全局声明为 static 。喜欢

    static Marker marker;
    static GoogleMap map;