我想基于列表(和之间的范围)执行快速添加/删除或隐藏/显示firstVisibleItem
标记lastVisibleItemsPrevious
。
这是一个从我的数据库中临时分配的列表
private List<MarkerOptions> mMarkers = new ArrayList<MarkerOptions>();
private int firstVisibleItemPrevious = 0;
private int lastVisibleItemsPrevious = 0;
//Loops, network commands, etc
// assign a marker per item
MarkerOptions markerOptions = new MarkerOptions()
.icon(BitmapDescriptorFactory.fromResource(R.drawable.marker))
.anchor(0.5f, 0.5f)
.visible(false)
.position(new LatLng( (Double) coords.get(1) , (Double) coords.get(0)));
mMarkers.add(position, markerOptions);
这就是标记的 I/O 的完成方式:
aListView.setOnScrollListener(new OnScrollListener() {
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
int lastVisibleItem = firstVisibleItem+visibleItemCount;
//if we have the markers from the DB and we notice a move do:
if( mMarkers.size() > 0 &&
(firstVisibleItemPrevious != firstVisibleItem ||
lastVisibleItemsPrevious != lastVisibleItem)
){
LatLngBounds.Builder builder = new LatLngBounds.Builder();
mMap.clear(); // clear the map to add new markers
for(int x = firstVisibleItem; x < lastVisibleItem; x++){
Marker mMarker = mMap.addMarker(mMarkers.get(x));
builder.include(mMarker.getPosition());
}
//animate
CameraUpdate cu = CameraUpdateFactory.newLatLngBounds(builder.build(), 60);
mMap.animateCamera(cu);
firstVisibleItemPrevious = firstVisibleItem;
lastVisibleItemsPrevious = lastVisibleItem;
}
}
}
使用我的方法,我遇到了三个问题:
- 首先是我完全擦除地图(眨眼)。
- 有些标记并不总是正确分配(我不明白为什么)。
- 因此 animateCamera 看起来它没有正确的所有位置
builder
我尝试了一种检查当前可见地图(列表)并检查新列表的方法,然后添加那些不在旧列表中的地图并删除那些不在新列表中的地图。但是它仍然很滞后,我最终添加了总是标记并且没有正确删除“旧”标记。我也试过Marker.setVisibility()
没有成功。
处理这些快速操作的好方法是什么?请记住,我至少应该有一个列表List<MarkerOptions>
或作为隐藏/显示操作的来源(动态分配)List<LatLng>
。List<Marker>