0

私は、プレーヤーIDとPlayerMarkerAndStatusオブジェクトを格納するための(Integer; PlayerMarkerAndStatus)ペアのhashmapを持っています。 PlayerMarkerAndStatusには、マーカーと、HashMapで指定されたプレーヤーIDの現在のステータスがあります。OnclickListenerをforループ内で正しく動作させる方法は?

また、Volley - OnSuccess(Player2 nearbyPlayer)の成功時にハッシュマップの各プレーヤーの詳細を返すAPIへのボレーリクエストがあります。これらのデータは、マーカーがクリックされたときにフラグメントに送信されると想定されます。onMarkerClick(Marker marker)

クリックされたマーカーとハッシュマップのマーカーを比較します。マーカーIDが等しい場合は、このプレイヤーの詳細をフラグメントに送信します。ただし、OnMarkerClickListenerは、クリックされたマーカーと比較するために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()); 
       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()); 
      } 

ログ:マーカーをクリックしたときに、

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

は、あなたが 'MMAPを'初期化しているあなたのループコードのためにあまりにも –

+0

を示して? – Pr38y

+0

@RahulSharmaどのfor forループ? – korujzade

答えて

0

マーカーIDからプレーヤーを取得するために、クラスレベルに1つのHashMapを定義する:反復HashMap

HashMap<String, Player2> playerMap = new 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()); 
} 

はプレイヤーを取得するための1つの方法を定義しますボレーのリクエストを使用して、マーカーをキーとして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はループが外れている必要があります。プレーヤーIDにはidPlayerMapのハッシュマップを1つ作成し、Player2を作成します。バレーの成功の応答では、そのマップにidを持つ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); 
       }); 
      } 
     } 
    } 
関連する問題