Fragmento dinámico de Android Google Maps en el soporte de RecyclerView

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

Yo estaba leyendo sobre él y vi que tengo que crear los fragmentos dinámicamente en lugar de hacerlo por XML para evitar los errores de identificación duplicados.

Aquí está mi código del 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(); } 

Ejecutando esto puedo ver el mapa mostrado en mi RecyclerView y todo parece estar funcionando bien. El problema aparece cuando me desplazo hacia arriba en el RecyclerView por un tiempo y luego vuelvo otra vez al mapa.

Cuando hago que la aplicación se bloquee y muestre este error:

Java.lang.IllegalArgumentException: Ninguna vista encontrada para id 0x1 (desconocido) para el fragmento SupportMapFragment {606864b # 0 id = 0x1}

Muchas gracias y amables saludos, Marcel.

Supongo que bindMapRow se llama en onBindViewHolder .

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

Para garantizar que la vista ya esté adjunta 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/

  • Java.lang.IllegalStateException: RecyclerView no tiene LayoutManager en Fragmento
  • Enlace de Datos de Android: Lista de Observables al Adaptador de RecyclerView
  • Elemento de Recyclerview efecto de ondulación de clic
  • Espacio Problema al crear el diseño del bus en la vista del reciclador Gridlayout manager
  • Cargando datos de forma eficaz en RecycleView
  • ¿Cómo puedo acceder al visor de un elemento en una vista de reciclador?
  • Enumera el alineamiento de elementos con Recycler View
  • Hacer desplazamiento de vista con un recyclerview y appbar
  • El desplazamiento de ViewPager no funciona con RecyclerView
  • Agregue RecyclerView (RecyclerFragment) a un cuadro de diálogo
  • ¿Puedo usar más de 2 vistas de reciclador en una actividad?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.