我的应用有多个位置保存在列表中(当前导航抽屉列表)。当用户单击每个列表行时,它将在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中我收集所有信息并使用位置标记加载地图。
谢谢。
答案 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;