4

Ich versuche, Google Maps Fragmente in einem RecyclerView in Android hinzuzufügen.Android Google Maps dynamische Fragment in RecyclerView Halter

Ich las darüber und ich sah, dass ich die Fragmente dynamisch erstellen muss, anstatt es durch XML zu tun, um doppelte ID-Fehler zu vermeiden.

Hier ist mein Adapter Code:

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(); 
} 

das Ausführen kann ich die Karte in meinen RecyclerView angezeigt sehen und alles scheint gut zu funktionieren. Das Problem taucht auf, wenn ich eine Weile im RecyclerView nach oben scrolle und dann wieder auf die Karte gehe.

Als ich tun, dass die App abstürzt und diesen Fehler zeigt:

java.lang.IllegalArgumentException: No view found for id 0x1 (unknown) for fragment SupportMapFragment{606864b #0 id=0x1}

Vielen Dank und freundlichen Grüßen Marcel.

+0

Niemand kann mir helfen? – MarcelPG

Antwort

0

Ich gehe davon aus, bindMapRow heißt onBindViewHolder. IllegalArgumentException: No view found for id

Der Grund für den Fehler ist, dass holder.mapContainer und frame nicht an die RecyclerView/Aktivität noch während onBindViewHolder (daher die Ansicht nicht Fehler gefunden).

Um sicherzustellen, dass die Ansicht bereits an RecyclerView/Activity angehängt ist, bevor Sie FragmentTransaction.replace anrufen, hören Sie stattdessen 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/