4

Я пытаюсь добавить фрагменты Google Maps в RecyclerView на Android.Динамический фрагмент Google Maps Google в держателе RecyclerView

Я читал об этом, и я увидел, что мне нужно создать фрагменты динамически, а не делать это с помощью XML, чтобы избежать дублирования ошибок идентификатора.

Вот мой адаптер код:

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

Выполнение этого я могу увидеть карту отображается в моем RecyclerView и все, кажется, работает хорошо. Проблема возникает, когда я некоторое время прокручиваюсь в RecyclerView, а затем снова возвращаюсь к карте.

Когда я делаю что приложение падает и показывает эту ошибку:

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

Большое спасибо и наилучшими пожеланиями, Марсель.

+0

Никто не может мне помочь? – MarcelPG

ответ

0

Я предполагаю, что bindMapRow называется по адресу onBindViewHolder.

Причиной ошибки IllegalArgumentException: No view found for id является то, что holder.mapContainer и frame не присоединен к RecyclerView/активность еще в течение onBindViewHolder (таким образом, представление не найдена ошибка).

Чтобы гарантировать, что представление уже подключено к RecyclerView/Activity перед вызовом FragmentTransaction.replace, выслушайте 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/