RecyclerView中的Google Map Lite模式,OnMapReady在列表更新后执行

时间:2017-11-26 05:29:58

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

我有recyclerView,其中我尝试使用google map lite模式显示每个项目的位置。这是我的RcyclerView适配器的实现:

 public class ItemListAdapter extends RecyclerView.Adapter<ItemListAdapter.MyViewHolder>{

    List<ItemListModel> items = new ArrayList<>();
    Context context;

    public ItemListAdapter(Context context) {
        this.context = context;
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.cardview_item,parent, false);
        return new MyViewHolder(v,context);
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
            ItemListModel item = items.get(position);
            holder.setMapLocation(new LatLng(item.getLat(), item.getLon()));
    }

    @Override
    public int getItemCount() {
        return items.size();
    }


    @Override
    public void onViewRecycled(MyViewHolder holder)
    {
        // Cleanup MapView here?
        if (holder.gMap != null)
        {
            holder.gMap.clear();
            holder.gMap.setMapType(GoogleMap.MAP_TYPE_NONE);
        }
    }
    public void setItmes(List<ItemListModel> items){
        this.items.addAll(items);
        notifyDataSetChanged();
    }

    public class MyViewHolder extends RecyclerView.ViewHolder implements OnMapReadyCallback{

        GoogleMap gMap;
        MapView map;
        LatLng mMapLocation;
        Context context;

        public MyViewHolder(View itemView,Context context) {
            super(itemView);

            map = (MapView) itemView.findViewById(R.id.mapImageView);
            this.context = context;
            if (map != null)
            {
                map.onCreate(null);
                map.onResume();
                map.getMapAsync(this);
            }
        }

        @Override
        public void onMapReady(GoogleMap googleMap) {

            MapsInitializer.initialize(context);
            gMap = googleMap;
        }
        public void setMapLocation(LatLng mapLocation) {
            mMapLocation = mapLocation;

            if(gMap != null) {
                updateMapContents();
            }
        }
        protected void updateMapContents() {
            gMap.clear();
            gMap.addMarker(new MarkerOptions().position(mMapLocation));
            CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(mMapLocation, 15f);
            gMap.moveCamera(cameraUpdate);
        }
    }

}

问题出在 myViewHolder onMapReady onMapReady 总是在我的列表发布后执行,因此 gMap 在列表更新期间为空。并且 setMapLocation 将无法按预期工作。作为一个结果,我在Recyclerview Item中的MapView始终为空。

我的代码在哪里我做错了?

1 个答案:

答案 0 :(得分:0)

我为解决这个问题所做的是:

  1. 在onBindViewHolder()中,将ViewHolder tag的{​​{1}}设置为您要显示的LatLng。 (即map)。您可以选择在ViewHolder中使用其他成员变量来临时保存您已经执行过的LatLng值。

  2. 当首次通过onCreateViewHolder()创建ViewHolder实例时,它会初始化地图,而onMapReady()会被称为AFTER onBindViewHolder()。现在在map.tag = new LatLng(item.getLat(), item.getLon())中,使用您在onMapReady()中设置的LatLng或您之前设置的任何变量。在您的情况下,只需致电map.tag

  3. 这应该可以解决您的问题。我受到这个解决方案的启发: https://github.com/androidcodegeeks/android-map_list/tree/master/app/src/main/java/com/example/google/maplist

    让我知道它是否有帮助,因为我有同样的问题。