自定义RecyclerViewAdapter中的MapView

时间:2018-08-19 17:55:31

标签: android android-recyclerview google-maps-android-api-2 android-mapview

我正在尝试实现一个RecyclerView,其中包含CardViews,其中每个MapView都在其中。 问题是,除非自定义Adapter 单击,否则不会加载在自定义适配器中初始化的MapView。 如此处已提及:Android MapView does not load unless you touch on the mapview 您可以通过覆盖onResume()解决问题。 我已经尝试过以下方法:

@Override
    public void onResume() {
        if(LocationsAdapter.ViewHolder.mapView != null) {
            LocationsAdapter.ViewHolder.mapView.onResume();
        }

        super.onResume();
    }

老实说,我根本不知道如何以任何其他方式重写onResume,如果我在这里违反了某些编程规则,请原谅我。 我在LocationsAdapter中创建的ViewHolder中将mapView设置为公共静态。这似乎不起作用,地图仍然空白。

适配器内的ViewHolder实现OnMapReadyCallback。

public static class ViewHolder extends RecyclerView.ViewHolder implements OnMapReadyCallback

...

 @Override
            public void onMapReady(GoogleMap googleMap) {
                this.googleMap = googleMap;
                Location location = locations.get(getAdapterPosition());
                this.googleMap.addMarker(new MarkerOptions().position(location.getLatlng()).title(location.getName()));
                this.googleMap.moveCamera(CameraUpdateFactory.newLatLng(location.getLatlng()));
                this.googleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(location.getLatlng(), 7.0f));
            }

调用ViewHolder时将调用这两个方法。

mapView.onCreate(null);
mapView.getMapAsync(this);

有关此问题的另一篇文章尚未解答:mapView inside cardview not load the map

我的目标是,无论片段当前处于哪个生命周期内,都加载地图。 我假设您将不需要适配器,片段或XML来解决此问题。如果您这样做,请告诉我。

2 个答案:

答案 0 :(得分:8)

请勿在回收器视图中使用地图视图,因为它是笨重的组件,会占用更多内存,而是使用专为与回收器视图/列表视图一起列出而设计的精简地图模式,有关更多详细信息,请参见此链接{{3 }}

Google还提供了有关如何在回收者视图中使用精简模式地图的演示,这是指向GitHub https://developers.google.com/maps/documentation/android-sdk/lite

的链接

答案 1 :(得分:0)

请确保在所有者中调用onResume

if (mapView != null) {
                // Initialise the MapView
                mapView.onCreate(null);
                mapView.onResume();  //Probably U r missing this
                // Set the map ready callback to receive the GoogleMap object
                mapView.getMapAsync(this);
            }