4

Google지도 조각을 Android의 RecyclerView에 추가하려고합니다.Android Google지도 RecyclerView 홀더의 동적 조각

필자는 그것에 대해 읽었으며 중복 된 ID 오류를 피하기 위해 조각으로 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

bindMapRowonBindViewHolder이라고합니다. 오류 IllegalArgumentException: No view found for id위한

이유 holder.mapContainerframe을 (따라서 볼은 오류없는) onBindViewHolder 중에 아직 RecyclerView/작동에 연결되지 않는다는 점이다.

FragmentTransaction.replace을 호출하기 전에보기가 RecyclerView/Activity에 이미 첨부되어 있음을 보장하려면 대신 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/