Android 将数据从片段直接传递到ViewHolder

Android 将数据从片段直接传递到ViewHolder,android,android-fragments,Android,Android Fragments,我有一个片段,使用它的ViewModel和Repository类,从GooglePlacesAPI获取数据。这个片段有一个recycler视图,使用访问者模式实现,因为它必须包含7种不同类型的ViewHolder。现在的问题是:其中一个支架内部有一个地图视图,我想将一个PolylineOptions对象从片段传递到ViewHolder(MapHolder),以便在屏幕上显示视图支架后加载它(以这种方式,首先显示地图支架,然后加载多边形线)。在过去,我在支架内提取多边形线,但我认为这是一种不好的做

我有一个片段,使用它的ViewModel和Repository类,从GooglePlacesAPI获取数据。这个片段有一个recycler视图,使用访问者模式实现,因为它必须包含7种不同类型的ViewHolder。现在的问题是:其中一个支架内部有一个地图视图,我想将一个PolylineOptions对象从片段传递到ViewHolder(MapHolder),以便在屏幕上显示视图支架后加载它(以这种方式,首先显示地图支架,然后加载多边形线)。在过去,我在支架内提取多边形线,但我认为这是一种不好的做法。现在,我创建了一个holder,在它的片段中保留一个引用,将其添加到RecycleServiceAdapter,当获取多段线时,我调用holder.load(polyline)。我认为这不是正确的解决方案,我希望能得到你的帮助

谢谢,这是事先准备好的

public class MapHolder implements FlexibleHolder, OnMapReadyCallback, GoogleMap.OnMarkerClickListener, GoogleMap.OnMapLoadedCallback, OnPolylineReady {

MapView mapView;

private GoogleMap map;

private final int polylineColor;
private final String name;
private final String address;
private final LatLng destination;
private final LatLng origin;

private final Bundle mapBundle;

private PolylineOptions lineOptions = null;

public MapHolder(int polylineColor,
                 LatLng location, LatLng userLocation,
                 String name, String address) {
    this.destination = location;
    this.origin = userLocation;
    this.name = name;
    this.address = address;
    this.polylineColor = polylineColor;
    mapBundle = new Bundle();
}

@Override
public int getLayout() {
    return R.layout.cardview_map;
}

@Override
public void displayView(@NonNull View rootView) {
    CardviewMapBinding binding = CardviewMapBinding.bind(rootView);
    mapView = binding.mapview;
    mapView.onCreate(mapBundle);
    mapView.onStart();
    mapView.getMapAsync(this);
}

@Override
public void onMapReady(GoogleMap googleMap) {
    map = googleMap;
    map.setOnMarkerClickListener(this);
    map.setOnMapLoadedCallback(this);
}

@Override
public void onMapLoaded() {
    Marker destMarker = map.addMarker(new MarkerOptions().position(destination)
            .title(name)
            .snippet(address));
    destMarker.showInfoWindow();
    if (lineOptions != null) {
        map.addPolyline(lineOptions.color(polylineColor));
    }
    map.addMarker(new MarkerOptions().position(origin).title("Tu sei qui!"));
    mapView.onSaveInstanceState(mapBundle);
    move();
}

@Override
public void onPolylineReady(PolylineOptions polylineOptions) {
    lineOptions = polylineOptions;
    if (map != null) {
        map.addPolyline(lineOptions.color(polylineColor));
        mapView.onSaveInstanceState(mapBundle);
    }
}

private void move() {
    LatLngBounds.Builder builder = new LatLngBounds.Builder();
    LatLngBounds bounds = builder.include(destination).include(origin).build();
    map.moveCamera(CameraUpdateFactory.newLatLngBounds(bounds, 200));
}

@Override
public boolean onMarkerClick(Marker marker) {
    marker.showInfoWindow();
    return true;
}
}

加载多段线所固有的片段截面

private final Observer<PolylineOptions> polylineObserver = polylineOptions -> {
    if (polylineOptions != null && mapHolder != null) {
        mapHolder.onPolylineReady(polylineOptions);
    }
};
private final Observer polylineObserver=polylineOptions->{
if(polylineOptions!=null&&mapHolder!=null){
mapHolder.onPolylineReady(polylineOptions);
}
};