Intereting Posts
JNI меняет C на C ++ getActionBar () setDisplayHomeAsUpEnabled (истина). Бросает NullPointerException при создании новой активности (Google – основное учебное пособие) Как я могу правильно контролировать ориентацию сцены на Android с помощью AIR mobile? Android включить Bluetoothheadset микрофон HttpURLConnection.getInputStream всегда бросает IOException в android 2.1 Цикл включения модуля кинжала Что такое жизненный цикл для адаптера RecyclerView? Может ли проект библиотеки Android иметь собственную базу данных SQLite? Xamarin Android TabLayout, вызывающий SetupWithViewPager, вызывает исключение Как отправить HTTP-запрос с помощью http-заголовка Jelly bean не вызывает onPrepareOptionsMenu () при первом открытии меню Как «встряхнуть» устройство Android в эмуляторе Android, чтобы вызвать меню dev для отладки моего приложения React Native Как играть в потоковое видео с удаленного URL-адреса в Android-качестве? Одновременное чтение и запись SQLite Текст в PagerTabStrip не отображается при 1-м представлении

DefaultClusterRenderer getMarker () возвращает значение null при масштабировании

Я хочу изменить фон маркера кластера при щелчке. Я делаю это через

@Override onClusterClick(Cluster<MyObject> cluster) { Marker marker = renderer.getMarker(cluster); marker.setIcon(....); } 

Это прекрасно работает для одного случая: когда я увеличиваю или уменьшаю масштаб, и количество маркеров кластера не изменяется. Например, если у меня было кластер из 15 кластеров и 5, а затем увеличьте уровень в или из, те же два кластера остаются. Нажав на один из них, теперь renderer.getMarker(cluster) возвращает null. Если они повторно кластеры после масштабирования, getMarker не равен нулю.

Мой DefaultClusterRenderer ниже. Я проверил маркер на onClusteredRendered и он никогда не был нулевым. Это ошибка в DefaultClusterRenderer или я должен сделать что-то еще?

 private class MyRenderer extends DefaultClusterRenderer<MyObject> { private IconGenerator iconGenerator; private float density; public MyRenderer(Context context, GoogleMap map, ClusterManager<MyObject> clusterManager) { super(context, map, clusterManager); density = context.getResources().getDisplayMetrics().density; } @Override protected void onBeforeClusterItemRendered(MyObject item, MarkerOptions markerOptions) { markerOptions.icon(BitmapDescriptorFactory.fromResource(R.drawable.my_pin)); } @Override protected void onBeforeClusterRendered(Cluster<MyObject> cluster, MarkerOptions markerOptions) { if(iconGenerator == null) { iconGenerator = new IconGenerator(getActivity()); iconGenerator.setContentView(makeTextView(getActivity())); } iconGenerator.setBackground(makeBackground(false)); markerOptions.icon(BitmapDescriptorFactory.fromBitmap(iconGenerator.makeIcon(String.valueOf(cluster.getSize())))); } @Override protected void onClusterRendered(Cluster<MyObject> cluster, Marker marker) { super.onClusterRendered(cluster, marker); // Marker is never null here } @Override protected boolean shouldRenderAsCluster(Cluster<MyObject> cluster) { return cluster.getSize() > 1; } private ShapeDrawable makeBackground(boolean isClicked) { ShapeDrawable background = new ShapeDrawable(new OvalShape()); background.setColorFilter(ContextCompat.getColor(getActivity(), isClicked ? R.color.cluster_marker_clicked : R.color.cluster_marker_unclicked), PorterDuff.Mode.SRC_ATOP); return background; } private SquareTextView makeTextView(Context context) { SquareTextView squareTextView = new SquareTextView(context); ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(-2, -2); squareTextView.setLayoutParams(layoutParams); squareTextView.setTextColor(ContextCompat.getColor(getActivity(), R.color.white)); squareTextView.setTypeface(Utils.getFontBold(getActivity())); squareTextView.setId(com.google.maps.android.R.id.text); int twelveDpi = (int) (12.0F * density); squareTextView.setPadding(twelveDpi, twelveDpi, twelveDpi, twelveDpi); return squareTextView; } public IconGenerator getIconGenerator(boolean isClicked) { iconGenerator.setBackground(makeBackground(isClicked)); return iconGenerator; } } 

Инициализация ClusterManager:

  final ClusterManager<MyObject> mClusterManager = new ClusterManager<>(getActivity(), googleMap); mClusterManager.addItems(items); renderer = new CustomRenderer(getActivity(), googleMap, mClusterManager); mClusterManager.setRenderer(renderer); mClusterManager.cluster(); mClusterManager.setOnClusterItemClickListener(this); googleMap.setOnMarkerClickListener(mClusterManager); 

@antonio: Эта инициализация работает для меня:

 public class MapsActivity extends FragmentActivity implements ClusterManager.OnClusterClickListener<MyObject> { // ... private void setUpClusterer() { googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(51.503186, -0.126446), 10)); mClusterManager = new ClusterManager<MyObject>(this, googleMap); mClusterManager.setOnClusterClickListener(this); renderer = new MyRenderer(this, googleMap, mClusterManager); mClusterManager.setRenderer(renderer); googleMap.setOnCameraChangeListener(mClusterManager); googleMap.setOnMarkerClickListener(mClusterManager); addItems(); } private void addItems() { // Set some lat/lng coordinates to start with. double lat = 51.5145160; double lng = -0.1270060; // Add ten cluster items in close proximity, for purposes of this example. for (int i = 0; i < 10; i++) { double offset = i / 60d; lat = lat + offset; lng = lng + offset; MyObject offsetItem = new MyObject(lat, lng); mClusterManager.addItem(offsetItem); } } @Override public boolean onClusterClick(final Cluster<MyObject> cluster) { Marker marker = renderer.getMarker(cluster); marker.setIcon(BitmapDescriptorFactory.fromResource(R.drawable.my_newpin)); return true; } } 

Не удалось получить renderer.getMarker(cluster) чтобы вернуть маркер в этом случае выше. Работа была создана:

 Map <Cluster<MyObject>, Marker> clusterMarkerMap = new HashMap<>(); 

Затем добавьте их в обратный вызов DefaultClusterRenderer поскольку маркер никогда не имеет нулевого значения:

 @Override protected void onClusterRendered(Cluster<MyObject> cluster, Marker marker) { super.onClusterRendered(cluster, marker); clusterMarkerMap.put(cluster, marker); } 

Поскольку DefaultClusterManager очищает их при изменении положения камеры, протрите карту маркера кластера, прежде чем создавать новые:

  googleMap.setOnCameraChangeListener(new GoogleMap.OnCameraChangeListener() { @Override public void onCameraChange(CameraPosition cameraPosition) { // Clear the map here because the markers will be recreated // when the manager is notified of a (zoom level) camera change if(zoomLevelChanged) clusterMarkerMap.clear(); mClusterManager.onCameraChange(cameraPosition); } }); 

Теперь я могу получить маркер успешно clusterMarkerMap.get(cluster)