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