2016-02-16 5 views
0

, поэтому я пытаюсь сделать это, когда пользователь нажимает маркер карты Google, действие покажет, что отобразит всю информацию внутри этого маркера. Но проблема в том, что все маркеры показывают тот же результат (который является элементом в первой строке моей базы данных parse.com). В настоящее время я использую Xamarin для разработки. Я буду признателен за любой ответ. Спасибо, ребята, продвинутые.Xamarin Android - маркер карты Google всегда показывает ту же информацию

public async void getGeoPoint(){ 
     string getPlaceName, getPlacePrice, getPlaceAddress, getOwnerContact, getRentalType, getOwnerName; 

     string xx = autoCompleteTextView.Text; 
     ParseQuery<ParseObject> query = ParseObject.GetQuery ("Rentals") 
     .WhereEqualTo ("rentalCity", xx); 
     IEnumerable<ParseObject> results = await query.FindAsync(); 

     foreach(var temp in results){ 
      getLatitude = temp.Get<double> ("rentalLatitude"); 
      getLongitude = temp.Get<double> ("rentalLongitude"); 
      getPlaceName = temp.Get<string> ("rentalName"); 
      getPlacePrice = temp.Get<string> ("rentalPrice"); 
      getPlaceAddress = temp.Get<string> ("rentalFullAddress"); 
      getOwnerContact = temp.Get<string> ("ownerContactNo"); 
      getRentalType = temp.Get<string> ("rentalType"); 
      getOwnerName = temp.Get<string> ("ownerName"); 
      myMarker = map.AddMarker(new MarkerOptions() 
       .SetPosition(new LatLng(getLatitude, getLongitude)) 
       .SetIcon(BitmapDescriptorFactory.FromResource(Resource.Drawable.edimeow)) 
       ); 
     } 

     map.MarkerClick += (object sender, GoogleMap.MarkerClickEventArgs e) => { 
      string selected = getPlaceName; 
      var passToRentalProfile = new Intent (this, typeof(HostRentalProfileList)); 
      passToRentalProfile.PutExtra ("selected", selected); 
      StartActivity (passToRentalProfile); 
      this.Finish(); 
     }; 


     btnList.Click += (object sender, EventArgs e) => { 
      var passToUserList = new Intent (this, typeof(UserListMode)); 
      passToUserList.PutExtra("arrData", xx); 
      StartActivity(passToUserList); 
      this.Finish(); 
     }; 

    }//getGeoPoint 

ответ

0

В вашем foreach цикле ваш перечисляя все результаты возвращаются, и в то время как вы добавляете новый маркер карты на различных гео-позиции, вы не хранить любые другие детали внутри маркера, который добавляется.

Впоследствии, когда вы перечислите следующий результат, сбросьте свои локальные переменные на новую информацию.

Ваш map.MarkerClick является общим обработчиком, который возникает для любого щелчка маркера карты.

Ваша попытка установить ссылку getPlaceName, которая установлена ​​ранее и будет всегда соответствовать последнему элементу в ваших результатах.

Вам необходимо сохранить эти результаты в какой-либо коллекции и добавить некоторый идентификатор к маркеру карты, который был создан, чтобы вы могли вернуться к исходному результату, чтобы использовать его, когда нажимаете на маркер карты.

0

У меня есть нечто похожее, где мне нужно отобразить пользовательское сообщение при щелчке маркера, я храню его в словаре и над GoogleMap.IOnMarkerClickListener, который передаст вам маркер, который был нажат.

общественного класса MarkerManager: java.lang.Object, GoogleMap.IOnMarkerClickListener {

private readonly GoogleMap _map; 

private Dictionary<Marker, int> _markerDictionary; 

public MarkerManager(GoogleMap map, BaseActivity activity) 
    { 
     _activity = activity; 
     _map = map; 
     _markerDictionary = new Dictionary<Marker, int>(); 
    } 


    public void AddMarkerCallback(LatLng position, string title, string bodyText, int? icon, Action<int, Marker> callback, 
     bool draggable = false, int id = 0) 
    { 
     var markerOptions = new MarkerOptions(); 
     markerOptions.SetPosition(position); 
     markerOptions.SetTitle(title); 
     markerOptions.SetSnippet(bodyText); 
     markerOptions.Draggable(draggable); 

     CallBack = callback; 

     if (icon.HasValue) 
     { 
      markerOptions.InvokeIcon(BitmapDescriptorFactory.FromResource(icon.Value)); 
     } 

     var marker = _map.AddMarker(markerOptions); 
     _markerDictionary.Add(marker, id); 

     _map.SetOnMarkerClickListener(this); 
    } 

    public void ClearMap() 
    { 
     if(_map != null) 
     _map.Clear(); 

     _markerDictionary = new Dictionary<Marker, int>(); 
    } 


    public bool OnMarkerClick(Marker p0) 
    { 
     p0.ShowInfoWindow(); 

     Console.WriteLine("maker click"); 

     HideMarkerAfterTime(p0); 

     foreach (var i in _markerDictionary) 
     { 
      if (!i.Key.Equals(p0)) continue; 
      if (CallBack == null) return true; 

      SeletedMarkerId = i.Value; 
      CallBack(i.Value, p0); 
      return true; 
     } 

     if (CallBackLocation != null) 
      CallBackLocation(p0.Position); 

     return false; 
    } 


    /// <summary> 
    /// The timer 
    /// </summary> 
    private System.Timers.Timer _timer; 

    /// <summary> 
    /// Hides the marker after time. 
    /// </summary> 
    /// <param name="p0">The p0.</param> 
    /// <param name="miliSeconds">The mili seconds.</param> 
    private void HideMarkerAfterTime(Marker p0, double miliSeconds = 3000) 
    { 
     //need to clean down timer object. if i click on another 
     //icon wierd things happen 
     if (_timer != null) _timer.Dispose(); 

     _timer = new System.Timers.Timer { Interval = miliSeconds }; 
     _timer.Start(); 
     _timer.Elapsed += (sender, args) => _activity.RunOnUiThread(() => 
     { 
      p0.HideInfoWindow(); 
      _timer.Stop(); 
     }); 
    } 
} 
Смежные вопросы