2016-09-22 89 views
0

我有一个用于存储Player ID和PlayerMarkerAndStatus对象的(Integer; PlayerMarkerAndStatus)对的散列表。 PlayerMarkerAndStatus具有在HashMap中指定的玩家ID的标记和当前状态。如何使OnclickListener在for循环中正确工作?

我也有排除请求API返回每个球员的详细资料在排球的成功案例 - OnSuccess(Player2 nearbyPlayer)。这些数据应该在点击标记时发送到片段 - onMarkerClick(Marker marker)

它比较点击标记和散列图中的标记。如果他们具有相同的标记ID,则将该玩家的详细信息发送给片段。但是,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

显示您的for循环代码太 –

+0

你在哪里初始化''MMAP? – Pr38y

+0

@RahulSharma什么'for'循环? – 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()); 
} 

定义一个方法来获取播放机使用排球请求并将球员设置为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和Player2创建一个散列图idPlayerMap。在凌空的成功反应中,把那个Player2对象与它在该地图上的id进行比较。在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); 
       }); 
      } 
     } 
    }