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.
- RecyclerView refresca los elementos sólo cuando se desplaza hacia abajo y hacia arriba
- Cómo implementar filtrado en RealmRecyclerViewAdapter
- Mostrar un RecyclerView en Fragmento
- Android 5.0 - Agregar cabecera / pie de página a un RecyclerView
- RecyclerView Varias vistas de disposición en una clase de adaptador
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.
- Inicio de DialogFragment desde una clase que se extiende RecyclerView.ViewHolder
- Reciclaje multi-expansible
- Deslizar para mostrar otro diseño oculto en la vista de reciclador android
- RecyclerView onBindViewHolder sólo se llama cuando los cambios getItemViewType
- RecyclerView wrap_content con GridLayoutManager
- Android: Control Desplazamiento suave sobre la vista del reciclador
- Recyclerviews en ViewPager
- Eliminar un elemento de RecyclerView- Android
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/