tutorial studio mapview google example ejemplo android google-maps android-recyclerview fragment google-maps-android-api-2

studio - Fragmento dinámico de Android Google Maps en el titular de RecyclerView



map fragment android studio (1)

Supongo que bindMapRow se llama en onBindViewHolder .

El motivo del error IllegalArgumentException: No view found for id holder.mapContainer y frame no está adjunto a RecyclerView / Activity durante onBindViewHolder (por lo tanto, el error de vista no encontrada).

Para garantizar que la vista ya está asociada a RecyclerView / Activity antes de llamar a FragmentTransaction.replace , escuche onViewAttachedToWindow .

class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { ... @Override public void onViewAttachedToWindow(ViewHolder holder) { super.onViewAttachedToWindow(holder); // If you have multiple View Type, check for the correct viewType SupportMapFragment mapFragment = holder.mapFragment; if (mapFragment == null) { mapFragment = SupportMapFragment.newInstance(); mapFragment.getMapAsync(new OnMapReadyCallback() { @Override public void onMapReady(GoogleMap googleMap) { ... } }); } FragmentManager fragmentManager = getSupportFragmentManager(); fragmentManager.beginTransaction().replace(R.id.map, mapFragment).commit(); } }

https://code.luasoftware.com/tutorials/android/supportmapfragment-in-recyclerview/

Estoy tratando de agregar fragmentos de Google Maps en un RecyclerView en Android.

Estaba leyendo sobre eso y vi que necesito crear los fragmentos de forma dinámica en lugar de hacerlo por XML para evitar los errores de ID duplicados.

Aquí está mi código de adaptador :

public class MapViewHolder extends RecyclerView.ViewHolder { protected FrameLayout mapContainer; public MapViewHolder(View v){ super(v); view = v; mapContainer = (FrameLayout) v.findViewById(R.id.mapContainer); } } private void bindMapRow(final MapViewHolder holder, int position) { MessageData message = (MessageData) messagesList.get(position); LocationData location = message.getLocation(); FrameLayout view = holder.mapContainer; FrameLayout frame = new FrameLayout(context); if (message.getIdMap() != 0) { frame.setId(message.getIdMap()); } else { message.setIdMap(generateViewId()); frame.setId(message.getIdMap()); messagesList.set(position, message); } int size = context.getResources().getDimensionPixelSize(R.dimen.row_chat_map_size); FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(size, size); frame.setLayoutParams(layoutParams); view.addView(frame); GoogleMapOptions options = new GoogleMapOptions(); options.liteMode(true); SupportMapFragment mapFrag = SupportMapFragment.newInstance(options); mapFrag.getMapAsync(new MapReadyCallback(location)); FragmentManager fm = activity.getSupportFragmentManager(); FragmentTransaction ft = fm.beginTransaction(); ft.replace(frame.getId(), mapFrag); ft.commit(); }

Al ejecutar esto, puedo ver el mapa que se muestra en mi RecyclerView y todo parece funcionar bien. El problema aparece cuando me desplazo hacia arriba en el RecyclerView por un tiempo y luego vuelvo al mapa.

Cuando lo hago, la aplicación falla y muestra este error:

java.lang.IllegalArgumentException: No se ha encontrado la vista para id 0x1 (desconocido) para el fragmento SupportMapFragment {606864b # 0 id = 0x1}

Muchas gracias y saludos cordiales, Marcel.