Google Maps Lite Mode вызывает рывок в RecyclerView
у меня естьRecyclerView
который представляет собой список элементов с вертикальной прокруткой. Каждый элемент списка содержит Google Maps V2 MapView вОблегченный режим, Я использую эту новую функцию, которая возвращает растровые изображения вместо полноценной карты в качестве заменыGoogle Static Maps API
.
MapView требует, чтобы вы позвонилиonCreate()
, onResume()
, onPause()
, onDestroy()
и т. д. из соответствующего метода родительского действия / фрагмента. Где правильное место, чтобы позвонить им изRecyclerView.Adapter
и / илиRecyclerView.ViewHolder
?
Как я могу очистить переработанные MapViews, чтобы память не протекала, при этом оставляя список свободным?
Google говорит, что Lite Mode можно использовать в списках:
... опция карты в «облегченном режиме», идеально подходит для ситуаций, когда требуется предоставить несколько небольших карт или карту, которая настолько мала, что значимое взаимодействие нецелесообразно, например, миниатюра в списке.
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 и 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
Обновление: (8 июня 2018 г.) Google выпустил пример кода для использования Lite Maps в ListView.Посмотреть здесь