Adding Google Maps to a RecyclerView
Asked Answered
B

3

7

I have added the map view inside the RecyclerView alongside other types of list items but now ... how and where do I initialize the map, where do I listen for onMapReady so that I can place a marker afterwards, and how do I handle the recycling of the item ?

Any ideas what the best practice is in this situation ?

Bipartisan answered 6/7, 2018 at 11:41 Comment(0)
T
19

There are two possible ways, to do this thing,
one is Google Static Maps API using, which will give you the snapshot of the map.

Another is, you can use com.google.android.gms.maps.MapView inside of recycler item and initialize in your viewholder like below,

public class AdapterWithMap extends RecyclerView.Adapter<AdapterWithMap.CustomeHolder> {

        @Override
        public void onBindViewHolder(CustomeHolder holder, int position)
        {
            GoogleMap thisMap = holder.mapCurrent;
            if(thisMap != null)
                thisMap.moveCamera();//initialize your position with lat long  or move camera
        }
        @Override
        public void onViewRecycled(CustomeHolder holder)
        {
            // Cleanup MapView here?
            if (holder.mapCurrent != null)
            {
                holder.mapCurrent.clear();
                holder.mapCurrent.setMapType(GoogleMap.MAP_TYPE_NONE);
            }
        }
        public class CustomeHolder extends RecyclerView.ViewHolder implements OnMapReadyCallback {
            GoogleMap mapCurrent;
            MapView map;

            public CustomeHolder(View view) {
                super(view);
                map = (MapView) view.findViewById(R.id.mapImageView);
                if (map != null)
                {
                    map.onCreate(null);
                    map.onResume();
                    map.getMapAsync(this);
                }

            }

            @Override
            public void onMapReady(GoogleMap googleMap) {
                MapsInitializer.initialize(getApplicationContext());
                mapCurrent = googleMap;
            }

        }
    }
Transcendence answered 6/7, 2018 at 13:27 Comment(1)
this using googlemap v1, then can be removed and not working after android 11Guttering
S
1

For example you can use Glide and load map preview, not map fragment Like this:

    GlideApp
        .with(context)
        .load("http://maps.google.com/maps/api/staticmap?center=" + 
               lat + 
               "," + 
               lng + 
               "&zoom=15&size=200x200&sensor=false" +
               "&markers=color:red%7Clabel:C%" + 
               markerLat + 
               "," + 
               markerLlng)
        .centerCrop()
        .into(myImageView);

Or using lib - static-maps-api

Skulk answered 6/7, 2018 at 11:46 Comment(3)
Using static maps are NOT FREE this solution is nice idea but costs some money. thanks anywayHitlerism
@AlpAltunel actualy, as you can see, my code not contains any api keys. So you can use it as many times as you wantSkulk
yes but if you use like your code after one request it fails and gives 403 error even if you use key or not.Hitlerism
I
1

there is something called lite mode in google map you can use in recycler view

check this litemode

and sample code example LiteListDemoActivity

Ictinus answered 29/11, 2018 at 12:0 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.