Как получить информацию о маркере из firebase на Android?

#java #android #firebase #google-maps #huawei-mobile-services

# #java #Android #firebase #google-карты #huawei-мобильные сервисы

Вопрос:

Здравствуйте, я создаю приложение на Android с Java, huawei maps и firebase, но у меня есть проблема, которую я не могу решить в течение нескольких дней, заключается в том, что при нажатии на маркер карты и отображении данных в текстовом представлении мне отображается только последняя запись моей базы данных, а не маркер, который я выбираю.

введите описание изображения здесь

введите описание изображения здесь

  public void listarMarcadores(DataSnapshot dataSnapshot) {
        try {
            final String key = dataSnapshot.getKey();
            HashMap<String, Object> value = (HashMap<String, Object>) dataSnapshot.getValue();

            double lat;
            double lon;
            final String nombre;
            final String tipo;
            final String descripcion;

            lat = Double.parseDouble(value.get("latitud").toString());
            lon = Double.parseDouble(value.get("longitud").toString());
            nombre = (String) value.get("nombre_puesto");
            tipo = (String) value.get("tipo_ambulante");
            descripcion = (String) value.get("descripcion");

            LatLng ubicacion = new LatLng(lat, lon);
            Marker mimarker;

            hMap.setOnMarkerClickListener(new HuaweiMap.OnMarkerClickListener() {
                @Override
                public boolean onMarkerClick(Marker marker) {

                    txtKey.setText(key);
                    txtNombre_puesto.setText(nombre);
                    txtDescripcion.setText(descripcion);
                    txtTipo.setText(tipo);


                    //, txtDireccion, txtHorario

                    mBottomSheetBehavior1.setState(BottomSheetBehavior.STATE_EXPANDED);


                    return false;
                }
            });
            if (!mMarkers.containsKey(key)) {
                if (tipo.equals("cevicheria")) {
                    mimarker = hMap.addMarker(new MarkerOptions().title(key).position(ubicacion).icon(BitmapDescriptorFactory.fromResource(R.drawable.pescado)));

                    mMarkers.put(key, mimarker).setIcon(BitmapDescriptorFactory.fromResource(R.drawable.pescado));


                }
                if (tipo.equals("chicharroneria")) {
                    mimarker = hMap.addMarker(new MarkerOptions().title(key).position(ubicacion).icon(BitmapDescriptorFactory.fromResource(R.drawable.cerdo)));

                    mMarkers.put(key, mimarker).setIcon(BitmapDescriptorFactory.fromResource(R.drawable.cerdo));
                    ;

                } else {
                    mimarker = hMap.addMarker(new MarkerOptions().title(key).position(ubicacion));
                    mMarkers.put(key, mimarker);

                }



            }


        } catch (Exception e) {
            Toast.makeText(this, "Error al listar marcadores", Toast.LENGTH_SHORT).show();
        }


    }
 

Комментарии:

1. Прежде чем использовать Huawei Map Kit, вы сначала интегрировали HMS SDK в свою Android Studio? Кстати, поддерживаемые устройства Map Kit — это только устройства Huawei.

2. Ширли да, я знаю

3. Вы не можете получить маркеры с карты Google или карты huawei? Если вы используете huawei map kit для кластеризации маркеров, рекомендуется использовать инструмент здесь: github.com/billtom20/3rd-maps-utils

Ответ №1:

Рекомендуется использовать этот полезный инструмент, основанный на инструменте Google с открытым исходным кодом и адаптируемый к Huawei Map cluster manager. Вы можете интегрировать инструмент для кластеризации маркеров.

Использование:

  1. Откройте Gradle, нажмите библиотека-> Задачи-> сборка-> сборка.
  2. После запуска найдите файл 3rd-maps-utils-2.1.0-yyyyMMdd.aar в library/build/outputs/aar/ path.
  3. Скопируйте файл 3rd-maps-utils-2.1.0-yyyyMMdd.aar в ваше собственное приложение / библиотеки / path.
  4. Добавьте коды ниже в файл project build.gradle.
 allprojects {
      repositories {
             ...
             flatDir {
                    dirs 'libs'
             }
      }
}
 
  1. Добавьте коды ниже в файл app build.gradle.
 dependencies {
    implementation(name: '3rd-maps-utils-2.1.0-yyyyMMdd', ext: 'aar')
    ...
}
 

Вы также можете ознакомиться с этой документацией: Маркеры кластеризации. Или обратитесь к образцу кода:

 @Override
   public void onMapReady(HuaweiMap map) {
       hMap = map;
       hMap.moveCamera(CameraUpdateFactory.newLatLngZoom(
           new LatLng(48.893478, 2.334595),10));
       hMap.addMarker(new MarkerOptions().position(new LatLng(48.891478, 2.334595)).title("Marker1").clusterable(true));
       hMap.addMarker(new MarkerOptions().position(new LatLng(48.892478, 2.334595)).title("Marker2").clusterable(true));
       hMap.addMarker(new MarkerOptions().position(new LatLng(48.893478, 2.334595)).title("Marker3").clusterable(true));
       hMap.addMarker(new MarkerOptions().position(new LatLng(48.894478, 2.334595)).title("Marker4").clusterable(true));
       hMap.addMarker(new MarkerOptions().position(new LatLng(48.895478, 2.334595)).title("Marker5").clusterable(true));
       hMap.addMarker(new MarkerOptions().position(new LatLng(48.896478, 2.334595)).title("Marker6").clusterable(true));
       hMap.setMarkersClustering(true);
   }
 

Ответ №2:

Внутри setOnMarkerClickListener вы устанавливаете объекты ниже (я предполагаю, что это текстовые представления) со значениями, которые вы извлекли из Firebase, но они никогда не обновляются с помощью объекта LatLng. Кроме того, объект LatLng никогда не обновляется после его первоначальной установки. Пожалуйста, убедитесь, что ваши объекты данных обновлены соответствующим образом, иначе он будет возвращать одно и то же значение каждый раз.

 txtKey.setText(key);
txtNombre_puesto.setText(nombre);
txtDescripcion.setText(descripcion);