我有一个地图视图,上面有成千上万个项目需要加载。显然,在创建视图时无法全部加载。
我猜我必须根据当前显示的内容异步加载它们。
如何仅加载屏幕上显示的地图部分中的项目?
我有一个地图视图,上面有成千上万个项目需要加载。显然,在创建视图时无法全部加载。
我猜我必须根据当前显示的内容异步加载它们。
如何仅加载屏幕上显示的地图部分中的项目?
使用AsyncTask将每个屏幕的单独图层加载。利用MapView api获取当前可见地图的纬度/经度。在后端发送纬度/经度边界框以获取所需的项目。大致从记忆中看,代码如下:
public class LoadMapItems extends AsyncTask<Integer,Integer,List<ItemizedOverlay>> {
private MapView view;
public LoadMapItems( MapView view ) {
this.view = view;
}
public List<ItemizedOverlay> doInBackground( Integer... params ) {
int left = params[0];
int top = params[1];
int right = params[2];
int bottom = params[3];
return convertToItemizedOverlay( someService.loadSomething( left, top, right, bottom ) );
}
private List<ItemizedOverlay> convertToItemizedOverlay( List<SomeObject> objects ) {
// ... fill this out to convert your back end object to overlay items
}
public void onPostExecute(List<ItemizedOverlay> items) {
List<Overlay> mapOverlays = mapView.getOverlays();
for( ItemizedOverlay item : items ) {
mapOverlays.add( item );
}
}
}
// somewhere else in your code you do this:
GeoPoint center = someMap.getMapCenter();
new LoadMapItems( someMap ).execute(
center.getLongitude() - someMap.getLongitudeSpan() / 2,
center.getLatitude() - someMap.getLatitudeSpan() / 2,
center.getLongitude() + someMap.getLongitudeSpan() / 2,
center.getLatitude() + someMap.getLatitudeSpan() / 2);