Создание собственного InfoWindow для Marker с использованием данных вне объекта Marker

Andy спросил: 11 марта 2019 в 07:31 в: java

У меня есть класс AnimalMarker, который должен представлять собой минимум обычного маркера карт Google (широта, долгота, местоположение) и объект Animal. И я использую базу данных Firebase Realtime для хранения этих AnimalMarkers.

Я хочу сделать, но не знаю, как это сделать, - создать собственное информационное окно (я создал новый макет и адаптер, который должен быть передан в MapActivity), который хотя и привязан к маркерам карт Google, должен брать данные из соответствующего AnimalMarker этого маркера.

Логика моей MapActivity:

  • создайте AnimalMarker, используя широту, долготу и принимая пользовательский ввод для добавления животного в него. теперь объект AnimalMarker создан
  • добавьте AnimalMarker в базу данных Firebase Realtime
  • , когда DatabaseListener получит обновление, он вызовет метод в MapActivity для повторного создания списка. маркеров google-maps и перерисовать их.

Теперь я понимаю, что вместо сохранения только маркеров google-maps в списке используется хэш-карта < AnimalMarker, Marker > было бы лучше, и обновлять Hashmap, когда слушатель базы данных замечает обновление. Но даже в этом случае я не знаю, как заставить InfoWindowAdapter принимать данные от связанного AnimalMarker маркера.

Вот мой code:

MapActivity

public class MapActivity extends FragmentActivity implements OnMapReadyCallback, GoogleApiClient.OnConnectionFailedListener {...private void initListeners() {
        Log.d(TAG, "initListeners: initializing SearchText");        firebaseAuth = FirebaseAuth.getInstance();
        geocoder = new Geocoder(MapActivity.this);
        markersDatabase = new MarkersDatabase();
        myMarkersList = new ArrayList<>();
        allMarkersList = new ArrayList<>();        mMap.setOnMapLongClickListener(new GoogleMap.OnMapLongClickListener(){
            @Override
            public void onMapLongClick(LatLng latLng) {
                List<Address> addresses = new ArrayList<>();
                try {
                    addresses = geocoder.getFromLocation(latLng.latitude, latLng.longitude, 1);
                } catch (IOException e) {
                    e.printStackTrace();
                }
                String locationTitle = addresses.get(0).getAddressLine(0);
                Log.d(TAG, "onMapLongClick: addresses = " + addresses.get(0));                AnimalMarker marker = new AnimalMarker(latLng.latitude, latLng.longitude, locationTitle, firebaseAuth.getCurrentUser().getUid());
                markersDatabase.addMarker(marker);
                mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(marker.getLatitude(), marker.getLongitude()), DEFAULT_ZOOM));            }
        });    }...    private void startMarkersListener() {
        markersDatabase.readCurrentUserMarkers(new MarkersDatabaseListener() {
            @Override
            public void onCurrentUserMarkersCallBack(List<AnimalMarker> list) {
                Log.d(TAG, "onCurrentUserMarkersCallBack: myMarkersList updated");                clearAllMyMarkers();
                for (AnimalMarker animalMarker : list) {
                    Marker marker = mMap.addMarker(new MarkerOptions()
                            .position(new LatLng(animalMarker.getLatitude(), animalMarker.getLongitude()))
                            .title(animalMarker.getLocation())
                            .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_GREEN))
                            .visible(myMarkersVisible));                    Log.d(TAG, "onCurrentUserMarkersCallBack: created a marker at: " + marker.getTitle());
                    myMarkersList.add(marker);
                }
            }            @Override
            public void onAllMarkersCallBack(List<AnimalMarker> list) {
                Log.d(TAG, "onCurrentUserMarkersCallBack ----> onAllMarkersCallBack: should never reach here");            }
        });}

MarkerInfoWindowAdapter

public class MarkerInfoWindowAdapter implements GoogleMap.InfoWindowAdapter{    private final View mWindow;
    private Context context;    public MarkerInfoWindowAdapter(Context context) {
        this.context = context;
        mWindow = LayoutInflater.from(context).inflate(R.layout.marker_info_window, null);
    }    private void renderWindowText(Marker marker, View view) {        // example code to come here
        String title = marker.getTitle();
        TextView titleTextView = (TextView) view.findViewById(R.id.miwLocation);
        if(!title.equals("")) {
            titleTextView.setText(title);
        }    }    @Override
    public View getInfoWindow(Marker marker) {
        renderWindowText(marker, mWindow);
        return mWindow;
    }    @Override
    public View getInfoContents(Marker marker) {
        renderWindowText(marker, mWindow);
        return mWindow;
    }
}

нужной мне информации в пользовательском информационном окне:


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/white_border"
    android:orientation="horizontal"
    android:padding="10dp">    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">        <TextView
            android:id="@+id/miwLocation"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentStart="true"
            android:layout_alignParentTop="true"
            android:layout_gravity="center_horizontal"
            android:layout_marginStart="150dp"
            android:layout_marginTop="5dp"
            android:ellipsize="end"
            android:maxLines="2"
            android:text="miwLocation"
            android:textColor="#000000"
            android:textSize="20sp"
            android:textStyle="bold" />        <ImageView
            android:src="@drawable/dog_icon"
            android:id="@+id/miwImage"
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:layout_below="@+id/miwLocation"
            android:layout_alignParentStart="true"
            android:layout_marginStart="18dp"
            android:layout_marginTop="10dp" />        <TextView
            android:id="@+id/miwAnimalName"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/miwLocation"
            android:layout_marginStart="30dp"
            android:layout_marginTop="12dp"
            android:layout_toEndOf="@+id/miwImage"
            android:layout_toRightOf="@id/miwImage"
            android:ellipsize="end"
            android:maxLines="2"
            android:text="miwAnimalName"
            android:textColor="#000000"
            android:textSize="17sp" />        <TextView
            android:id="@+id/miwAnimalAge"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@id/miwAdultCB"
            android:layout_marginStart="20dp"
            android:layout_marginTop="10dp"
            android:layout_toRightOf="@id/miwImage"
            android:text="3 yrs"
            android:textColor="#000000"
            android:textSize="20sp" />        <CheckBox
            android:id="@+id/miwAdultCB"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@id/miwAnimalName"
            android:layout_marginLeft="20dp"
            android:layout_marginTop="8dp"
            android:layout_toRightOf="@id/miwImage"
            android:text=" Adult"
            android:textSize="20dp" />        <CheckBox
            android:id="@+id/miwNeuteredCB"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@id/miwAnimalName"
            android:layout_marginLeft="20dp"
            android:layout_marginTop="8dp"
            android:layout_toRightOf="@id/miwAdultCB"
            android:text=" Neutered"
            android:textSize="20dp" />    </RelativeLayout></LinearLayout>

Изображение этого изображения:


0 ответов