Google Maps Lite-Modus verursacht einen Ruck in RecyclerView

Ich habe einRecyclerView ist eine vertikale Liste von Elementen. Jedes Listenelement enthält eine Google Maps V2 MapView inLite-Modu. Ich nutze diese neue Funktion, die anstelle einer vollständigen Karte Bitmaps als Ersatz für das @ zurückgibGoogle Static Maps API.

Kartenansich setzt voraus, dass Sie @ anrufonCreate(), onResume(), onPause(), onDestroy() etc. aus der entsprechenden Methode der übergeordneten Aktivität / des Fragments. Wo ist der richtige Ort, um diese aus dem @ zu nennRecyclerView.Adapter und / oderRecyclerView.ViewHolder?

Wie kann ich recycelte MapViews bereinigen, damit kein Speicherplatz verloren geht, während die Liste unbeschwert bleibt?

Google sagt, dass der Lite-Modus in Listen verwendet werden kann:

... die Kartenoption "Lite-Modus", ideal für Situationen, in denen Sie eine Reihe kleinerer Karten oder eine Karte bereitstellen möchten, die so klein ist, dass eine sinnvolle Interaktion nicht praktikabel ist, z. B. eine Miniaturansicht in einer Liste.

ListItem.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent">

    <com.google.android.gms.maps.MapView
        android:id="@+id/mapImageView"
        xmlns:map="http://schemas.android.com/apk/res-auto"
        android:layout_width="80dp"
        android:layout_height="100dp"
        map:liteMode="true"
        map:mapType="normal"
        map:cameraZoom="15"/>

<!-- ... -->

</RelativeLayout>

RecyclerView.Adapter und ViewHolder

public class NearbyStopsAdapter extends RecyclerView.Adapter<NearbyStopsAdapter.ViewHolder> {

    private final Context mContext;

    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

        MapView map;

        public ViewHolder(View view) {
            super(view);
            map = (MapView) view.findViewById(R.id.mapImageView);
            // Should this be created here?
            map.onCreate(null);
            map.onResume();
        }
    }

    public NearbyStopsAdapter(Context c) {
        this.mContext = c;
    }

    @Override public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int position) {
        View itemView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.list_item_nearby_stop, viewGroup, false);
        return new ViewHolder(itemView);
    }

    @Override public void onBindViewHolder(ViewHolder holder, int position) {
        //Call Async Map here?
        holder.map.getMapAsync(this);
    }

    @Override public void onViewRecycled(ViewHolder holder) {
        // Cleanup MapView here?
//        if (holder.map != null) {
//            holder.map.onPause();
//            holder.map.onDestroy();
//        }
    }

    @Override public void onViewAttachedToWindow(ViewHolder holder) {
        // Setup MapView here?
//            holder.map.onCreate(null);
//            holder.map.onResume();
    }

    @Override public void onViewDetachedFromWindow(ViewHolder holder) {
        // Cleanup MapView here?
//        if (holder.map != null) {
//            holder.map.onPause();
//            holder.map.onDestroy();
//        }
    }

    // ...
}

Logcat:

I/Google Maps Android API﹕ Google Play services package version: 659943
W/Google Maps Android API﹕ Map Loaded callback is not supported in Lite Mode
W/Google Maps Android API﹕ Buildings are not supported in Lite Mode
W/Google Maps Android API﹕ Indoor is not supported in Lite Mode
W/Google Maps Android API﹕ Toggling gestures is not supported in Lite Mode
W/Google Maps Android API﹕ Toggling gestures is not supported in Lite Mode
W/Google Maps Android API﹕ Toggling gestures is not supported in Lite Mode
W/Google Maps Android API﹕ Toggling gestures is not supported in Lite Mode

Update: (8. Juni 2018) Google hat ein Codebeispiel für die Verwendung von Lite Maps in einer ListView veröffentlicht.Siehe hie

Antworten auf die Frage(12)

Ihre Antwort auf die Frage