【问题标题】:How to make OnclickListener work right inside for loop?如何使 OnclickListener 在 for 循环中正常工作?
【发布时间】:2016-09-22 07:46:55
【问题描述】:

我有一个 (Integer; PlayerMarkerAndStatus) 对的哈希图,用于存储 Player id 和 PlayerMarkerAndStatus 对象。 PlayerMarkerAndStatus 具有在 HashMap 中指定的玩家 id 的标记和当前状态。

我还向 API 发出了 volley 请求,该请求返回了 Volley 成功案例中每个 hashmap 玩家的详细信息 - 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 从哈希图中取一个正确的标记?

【问题讨论】:

  • 也显示你的 for 循环代码
  • 你在哪里初始化mMap
  • @RahulSharma 什么for 循环?
  • @Pr38y,它是onMapReady(Google googleMap) 方法,基本上将地图类型分配给GoogleMap mMap - mMap = googleMap; mMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);

标签: java android google-maps onclicklistener google-maps-api-2


【解决方案1】:

定义一个 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());
}

定义一种使用 volley request 获取玩家并使用标记作为键将玩家设置为 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;
      }
});

【讨论】:

    【解决方案2】:

    setOnMarkerClickListener 应该在循环之外。为玩家 ID 和 Player2 创建一个哈希图 idPlayerMap。在 volley 成功响应中,将带有其 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);
                    });
                }
            }
        }
    

    【讨论】:

      猜你喜欢
      • 2017-11-11
      • 2021-03-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-26
      • 2020-10-27
      • 1970-01-01
      • 2019-04-04
      • 1970-01-01
      相关资源
      最近更新 更多