Xamarin.Forms在Android项目中加载pin异步

时间:2017-07-30 15:33:11

标签: c# xamarin xamarin.android xamarin.forms async-await

我正在加载我的图钉async,如果我不使用自定义地图,效果会很好。但是,如果我在Android project中使用自定义地图,它就不再起作用了。我的custom Pin list为空。我能理解这是因为我正在加载引脚异步并且自定义引脚列表尚未初始化。但是我该如何解决呢?在所有平台(Android,iOS,UWP)中修复此问题是否有很多工作要做?

    public CustomMap Map { get; set; }

    public async Task InitilizePins()
    {
        var pins = (await new SamplePins().GetPinsAsync()).ToList();
        Map.CustomPins = pins;

        foreach (var customPin in pins)
        {
            Map.Pins.Add(customPin.Pin);
        }
    }

    public class CustomMap : Map
    {
        public List<CustomPin> CustomPins { get; set; }
    }

这是我在Android中的自定义地图。我的自定义引脚在我的表单映射变量上为空。

        List<CustomPin> customPins;

    protected override void OnElementChanged(ElementChangedEventArgs<Map> e)
    {
        base.OnElementChanged(e);

        if (e.OldElement != null)
        {
            NativeMap.InfoWindowClick -= OnInfoWindowClick;
        }

        if (e.NewElement != null)
        {
            var formsMap = (CustomMap)e.NewElement;

            customPins = formsMap.CustomPins;
            ((MapView)Control).GetMapAsync(this);
        }
    }

1 个答案:

答案 0 :(得分:2)

  

我可以理解它,因为我正在加载引脚异步并且自定义引脚列表尚未初始化。但是我该如何解决呢?

解决问题的最快方法是将CustomPinsList<CustomPin>更改为ObservableCollection<CustomPin>(您需要更改项目中的所有相关代码)。

然后在Android项目中注册ObservableCollection<CustomPin>的{​​{1}}个事件:

CollectionChanged

然后,无论何时添加新引脚,都会触发protected override void OnElementChanged (Xamarin.Forms.Platform.Android.ElementChangedEventArgs<Map> e) { base.OnElementChanged (e); if (e.OldElement != null) { NativeMap.InfoWindowClick -= OnInfoWindowClick; } if (e.NewElement != null) { var formsMap = (CustomMap)e.NewElement; //register the CollectionChanged event formsMap.CustomPins.CollectionChanged += CustomPins_CollectionChanged; customPins = formsMap.CustomPins; Control.GetMapAsync(this); } } private void CustomPins_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) { customPins = (ObservableCollection<CustomPin>)sender; //rerender all the pins in the map NativeMap.Clear(); foreach (var pin in customPins) { var marker = new MarkerOptions(); marker.SetPosition(new LatLng(pin.Pin.Position.Latitude, pin.Pin.Position.Longitude)); marker.SetTitle(pin.Pin.Label); marker.SetSnippet(pin.Pin.Address); marker.SetIcon(BitmapDescriptorFactory.FromResource(Resource.Drawable.pin)); NativeMap.AddMarker(marker); } isDrawn = true; } 并重新映射地图的引脚。