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.