android - Firebase Recycler 中的多个 Google Map Lite

标签 android google-maps google-maps-android-api-2 firebaseui

我试图让它运行,但我得到的唯一结果是在左下角 fragment 位置有一个带有 Google Logo 的灰色网格。 map 旨在显示在 FirebaseRecyclerAdapter 加载的 CardView 中。没有抛出任何错误,并且 API key 是正确的。当我快速上下滚动项目几次时, map 似乎在每次滚动时加载缓慢。如果不滚动,则不会加载任何内容。

卡片的 XML 为:

LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:card_view="http://schemas.android.com/apk/res-auto"
xmlns:map="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">

<android.support.v7.widget.CardView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    card_view:cardUseCompatPadding="true"
    card_view:cardElevation="1dp"
    card_view:cardCornerRadius="0dp"
    android:layout_marginLeft="-3dp"
    android:layout_marginRight="-3dp"
    android:id="@+id/cv">
    <com.google.android.gms.maps.MapView 
                class="com.google.android.gms.maps.MapFragment"
                android:id="@+id/mapLite"
                android:layout_width="match_parent"
                android:layout_height="150dp"
                map:mapType="normal"
                map:liteMode="true"/>
    </android.support.v7.widget.CardView>
</LinearLayout>

Firebase适配器的代码如下:

adapter = new FirebaseRecyclerAdapter<Post, PostViewHolder>(Post.class, R.layout.card_view_item, PostViewHolder.class, ref.child("message").child(currentGroupKey)) {

    @Override
    protected void populateViewHolder(final PostViewHolder postViewHolder, final Post post, int position) {
        super.populateViewHolder(postViewHolder, post, position);
    }
};

PostViewHolder 的代码:

public class PostViewHolder extends RecyclerView.ViewHolder implements OnMapReadyCallback {
    public MapView mapView;


    public PostViewHolder(View itemView) {
       super(itemView);

        mapView = (MapView) itemView.findViewById(R.id.mapLite);

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

    @Override
    public void onMapReady(GoogleMap googleMap) {
        CameraUpdate updateCamera = CameraUpdateFactory.newCameraPosition(new CameraPosition(new LatLng(40.712784, -74.005941), 10, 0f, 0));
        googleMap.moveCamera(updateCamera);
    }
}

有人知道可能是什么问题吗?

最佳答案

我找到答案了!问题是 XML 中的命名空间错误。我通过研究这个例子找到了解决方案:https://github.com/saxman/android-map_list 。下面我发布了上面显示的文件的正确版本,以防有人遇到类似的问题:

卡的 XML:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:card_view="http://schemas.android.com/apk/res-auto"
xmlns:map="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.CardView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    card_view:cardUseCompatPadding="true"
    card_view:cardElevation="1dp"
    card_view:cardCornerRadius="0dp"
    android:layout_marginLeft="-3dp"
    android:layout_marginRight="-3dp"
    android:id="@+id/cv">
            <com.google.android.gms.maps.MapView
                android:name="com.google.android.gms.maps.MapFragment"
                android:id="@+id/mapLite"
                android:layout_width="match_parent"
                android:layout_height="150dp"
                map:liteMode="true"/>
    </LinearLayout>
</android.support.v7.widget.CardView>

Firebase 适配器的代码:

adapter = new FirebaseRecyclerAdapter<Post, PostViewHolder>(Post.class, R.layout.card_view_item, PostViewHolder.class, ref.child("message").child(currentGroupKey)) {
    @Override
    public void onBindViewHolder(PostViewHolder viewHolder, int position) {
        super.onBindViewHolder(viewHolder, position);
        viewHolder.setMapLocation(52.235474, 21.004057);
    }

    @Override
    protected void populateViewHolder(final PostViewHolder postViewHolder, final Post post, int position) {
        super.populateViewHolder(postViewHolder, post, position);
    }
};

还有 PostViewHolder:

    public class PostViewHolder extends RecyclerView.ViewHolder {
    public MapView mapView;

    protected GoogleMap mGoogleMap;
    protected LatLng mMapLocation;

    public PostViewHolder(final View itemView) {
        super(itemView);
        mapView = (MapView) itemView.findViewById(R.id.mapLite);

        mapView.onCreate(null);
        mapView.getMapAsync(new OnMapReadyCallback() {
            @Override
            public void onMapReady(GoogleMap googleMap) {

                mGoogleMap = googleMap;
                MapsInitializer.initialize(itemView.getContext());
                googleMap.getUiSettings().setMapToolbarEnabled(true);
                if (mMapLocation != null) {
                    updateMapContents();
                }
            }
        });
    }

    public void setMapLocation(double lat, double lon) {
        mMapLocation = new LatLng(lat, lon);

        if (mGoogleMap != null) {
            updateMapContents();
        }
    }

    protected void updateMapContents() {
        mGoogleMap.clear();
        // Update the mapView feature data and camera position.
        mGoogleMap.addMarker(new MarkerOptions().position(mMapLocation));
        CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(mMapLocation, 10f);
        mGoogleMap.moveCamera(cameraUpdate);
    }
}

关于android - Firebase Recycler 中的多个 Google Map Lite,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34828996/

相关文章:

javascript - 自定义街景按钮/控件

javascript - 删除由缩放引起的谷歌地图上的网格线

java - Android:Google Maps API - 更改 map 工具栏的位置

android - 如何在 android 的谷歌地图中选择不同的路线?

java - Dagger2 组件未创建

android - FragmentManager的异步

android - 如何指定 Android 模拟器应该在我的开发机器上使用哪个网络接口(interface)?

android - 如何从 Google Fit API 检索每日运行和步行步数

javascript - 来自地址的标记人口

Android 谷歌地图 API v2 : Authorization failure at different laptops