[英]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.