0

У меня есть hashmap пары (Integer; PlayerMarkerAndStatus) для хранения идентификатора игрока и объекта PlayerMarkerAndStatus. PlayerMarkerAndStatus имеет маркер и текущий статус для идентификатора игрока, указанного в HashMap.Как заставить OnclickListener работать внутри цикла?

У меня также есть запрос волейбола к API, который возвращает детали каждого игрока хэш-карты на случай успеха Volley - OnSuccess(Player2 nearbyPlayer). Предполагается, что эти данные будут отправлены фрагменту при щелчке маркера - onMarkerClick(Marker marker).

Он сравнивает маркер щелчка и маркер от хэш-карты. Если у них одинаковые идентификаторы маркера, он отправляет детали этого игрока в фрагмент. Тем не менее, OnMarkerClickListener берет только последний маркер HashMap для сравнения с щелчком маркера.

Это мой код ниже:

for (final Map.Entry<Integer, PlayerMarkerAndStatus> e : 
        player_id_marker_status.entrySet()) { 
       Log.d(LOG_TAG, "marker id of current entry: " + e.getValue().getMarker().getId()); 
       getNearbyPlayerDetails(new VolleyCallbackNearbyPlayerDetails() { 
        @Override 
        public void onSuccess(final Player2 nearbyPlayer) { 
         mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() { 
          @Override 
          public boolean onMarkerClick(Marker marker) { 
           Log.d(LOG_TAG, "clicked marker id: " + marker.getId()); 
           Log.d(LOG_TAG, "current marker id: " + e.getValue().getMarker().getId()); 

           if (marker.getId().equals(e.getValue().getMarker().getId())) { 
            Log.d(LOG_TAG, "marker clicked. Player id: " + e.getKey()); 

            PlayerDetailsFragment playerDetailsFragment = 
              new PlayerDetailsFragment(); 

            Bundle bundle = new Bundle(); 
            bundle.putString("player_details_username", 
              nearbyPlayer.getSurname()); 
            if (nearbyPlayer.getType() == -1) 
             bundle.putString("player_details_type", "a"); 
            else { 
             bundle.putString("player__details_type", "b"); 
            } 
            bundle.putInt("player_details_health", 
              nearbyPlayer.getHealth()); 

            playerDetailsFragment.setArguments(bundle); 
            getSupportFragmentManager().beginTransaction() 
              .add(R.id.player_details_fragment_container, 
                playerDetailsFragment).commit(); 

            return true; 
           } 
           return false; 
          } 
         }); 
        } 
       }, e.getKey()); 
      } 

Журналы HashMap:

09-22 11:37:42.410 23553-23553/com.orujzade.asdf D/MainActivity: marker id of current entry: m3 
09-22 11:37:42.415 23553-23553/com.orujzade.asdf D/MainActivity: marker id of current entry: m2 
09-22 11:37:42.415 23553-23553/com.orujzade.asdf D/MainActivity: marker id of current entry: m1 

Журналы по маркеру мыши:

09-22 11:39:15.353 23553-23553/com.orujzade.asdf D/MainActivity: clicked marker id: m3 
09-22 11:39:15.353 23553-23553/com.orujzade.asdf D/MainActivity: current marker id: m1 
09-22 11:39:20.593 23553-23553/com.orujzade.asdf D/MainActivity: clicked marker id: m2 
09-22 11:39:20.593 23553-23553/com.orujzade.asdf D/MainActivity: current marker id: m1 
09-22 11:39:25.593 23553-23553/com.orujzade.asdf D/MainActivity: clicked marker id: m4 
09-22 11:39:25.593 23553-23553/com.orujzade.asdf D/MainActivity: current marker id: m1 

Как я могу сделать OnMarkerClickListener взять правильный маркер из хэшмап?

+0

показать ваш код для слишком –

+0

петли, где вы инициализация '' MMAP? – Pr38y

+0

@RahulSharma, что за 'цикл? – korujzade

ответ

0

Определите один HashMap в уровень класса, чтобы получить игрок из маркеров ID:

HashMap<String, Player2> playerMap = new HashMap<>(); 

итерацию HashMap и получить игрок сверху определить метод:

for (final Map.Entry<Integer, PlayerMarkerAndStatus> e : player_id_marker_status.entrySet()) { 
    Log.d(LOG_TAG, "marker id of current entry: " + e.getValue().getMarker().getId()); 
    getNearbyPlayer(e.getKey(),e.getValue().getMarker().getId()); 
} 

Define один метод, чтобы получить игрок используя запрос волейбола и установить игрока в HashMap, используя маркер в качестве ключа:

public void getNearbyPlayer(Integer playerId,final String markerId) { 
     getNearbyPlayerDetails(new VolleyCallbackNearbyPlayerDetails() { 
      @Override 
      public void onSuccess(final Player2 nearbyPlayer) { 
       playerMap.put(markerId, nearbyPlayer); 
      } 
     },playerId); 
} 

наконец определить маркер щелчок слушателя и получить игрок из маркеров ID:

mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() { 
     @Override 
     public boolean onMarkerClick(Marker marker) { 
      Log.d(LOG_TAG, "clicked marker id: " + marker.getId()); 
      Player2 nearbyPlayer = playerMap.get(marker.getId()); 
      PlayerDetailsFragment playerDetailsFragment = new PlayerDetailsFragment(); 
      Bundle bundle = new Bundle(); 
      bundle.putString("player_details_username", nearbyPlayer.getSurname()); 
      if (nearbyPlayer.getType() == -1){ 
       bundle.putString("player_details_type", "a"); 
      }else { 
       bundle.putString("player__details_type", "b"); 
      } 
      bundle.putInt("player_details_health", nearbyPlayer.getHealth()); 
      playerDetailsFragment.setArguments(bundle); 
      getSupportFragmentManager().beginTransaction().add(R.id.player_details_fragment_container, playerDetailsFragment).commit(); 
      return true; 
     } 
}); 
0

setOnMarkerClickListener должно быть вне петли. Создайте один hashmap idPlayerMap для идентификатора игрока и Player2. в ответе на успех волей, поставьте этот объект Player2 с его идентификатором на этой карте. В MarkerClickListener запустите цикл, чтобы проверить, какой маркер был нажат, и получить соответствующий игрок от idPlayerMap и отправить его на нужный Fragment.

mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() { 
             @Override 
             public boolean onMarkerClick(Marker marker) { 
              Log.d(LOG_TAG, "clicked marker id: " + marker.getId()); 
              Log.d(LOG_TAG, "current marker id: " + e.getValue().getMarker().getId()); 
              for (final Map.Entry<Integer, PlayerMarkerAndStatus> e : 
                player_id_marker_status.entrySet()) { 
               Log.d(LOG_TAG, "marker id of current entry: " + e.getValue().getMarker().getId()); 
               if (marker.getId().equals(e.getValue().getMarker().getId())) { 
                Log.d(LOG_TAG, "marker clicked. Player id: " + e.getKey()); 

                PlayerDetailsFragment playerDetailsFragment = 
                  new PlayerDetailsFragment(); 
                Player2 nearbyPlayer = idPlayerMap.get(e.getKey()); 
                Bundle bundle = new Bundle(); 
                bundle.putString("player_details_username", 
                  nearbyPlayer.getSurname()); 
                if (nearbyPlayer.getType() == -1) 
                 bundle.putString("player_details_type", "a"); 
                else { 
                 bundle.putString("player__details_type", "b"); 
                } 
                bundle.putInt("player_details_health", 
                  nearbyPlayer.getHealth()); 

                playerDetailsFragment.setArguments(bundle); 
                getSupportFragmentManager().beginTransaction() 
                  .add(R.id.player_details_fragment_container, 
                    playerDetailsFragment).commit(); 

                return true; 
               } 
               return false; 
              } 
             } 
             HashMap<Integer, Player2> idPlayerMap = new HashMap<Integer, Player2>(); 

    for (final Map.Entry<Integer, PlayerMarkerAndStatus> e : 
      player_id_marker_status.entrySet()) { 
     Log.d(LOG_TAG, "marker id of current entry: " + e.getValue().getMarker().getId()); 
     getNearbyPlayerDetails(new VolleyCallbackNearbyPlayerDetails() { 
      @Override 
      public void onSuccess(Player2 nearbyPlayer) { 
       idPlayerMap.put(e.getKey(), nearbyPlayer); 
       }); 
      } 
     } 
    } 
Смежные вопросы