簡體   English   中英

如何使OnclickListener在循環內部正常工作?

[英]How to make OnclickListener work right inside for loop?

我有一個(Integer; PlayerMarkerAndStatus)對的哈希表,用於存儲Player ID和PlayerMarkerAndStatus對象。 PlayerMarkerAndStatus具有HashMap中指定的玩家ID的標記和當前狀態。

我還向API提出了凌空請求,該請求返回有關Volley- 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從哈希圖中獲取正確的標記?

setOnMarkerClickListener應該是循環的。 創建一個HashMap的idPlayerMap的玩家ID和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);
                });
            }
        }
    }

定義一個HashMap到類級別,以從標記id中獲取玩家:

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

迭代HashMap並從上面的define方法獲取播放器:

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());
}

定義一種使用截擊請求獲取球員的方法,並使用marker作為鍵將球員設置為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;
      }
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM