Создание собственного InfoWindow для Marker с использованием данных вне объекта Marker - PullRequest
0 голосов
/ 04 апреля 2019

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

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

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

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

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

Вот мой код:

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>

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

Imgur

1 Ответ

0 голосов
/ 04 апреля 2019

Я нашел решение после понимания ответа в этом посте

Адаптер пользовательского информационного окна с пользовательскими данными на карте v2

Самый простой подход - создатьанонимного адаптера и используйте глобальный HashMap внутри него.

Как-то так


getMap().setInfoWindowAdapter(new InfoWindowAdapter() {

        @Override
        public View getInfoWindow(Marker arg0) {
            return null;
        }

        @Override
        public View getInfoContents(Marker arg0) {

            // set layout, use Marker/AnimalMarker here

        }
    });

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...