【问题标题】:Android marker infowindow shows same info from arrayAndroid 标记信息窗口显示来自数组的相同信息
【发布时间】:2017-03-15 14:20:43
【问题描述】:

我在一个数组中接收来自我的 firebase 的字符串。在 Toast 消息中,一切正常。但我想将信息显示到标记中。问题是,我只将数组中的最后信息接收到标记中。所以所有标记都有相同的信息。有人知道我如何以正确的方式处理这个问题吗?我已经搜索了一些解决方案,但我坚持了下来。

final DatabaseReference getlats = FirebaseDatabase.getInstance().getReference().child("Events");
getlats.addChildEventListener(new ChildEventListener() {
  @Override
  public void onChildAdded(DataSnapshot dataSnapshot, String s) {
    final Map<String, String> value = (Map<String, String>)dataSnapshot.getValue();
    String getslat = value.get("latitude");
    String getslong = value.get("longitude");

    final String Img = value.get("EventImg");
    final String Titel = value.get("Title");
    final String Beschreibung = value.get("Desc");
    final String Datum = value.get("Datum");
    final String Uhrzeit = value.get("Uhrzeit");

    double getlat = Double.parseDouble(getslat);
    double getlong = Double.parseDouble(getslong);

    mMap.setInfoWindowAdapter(new GoogleMap.InfoWindowAdapter() {
      @Override
      public View getInfoWindow(Marker marker) {
        View v = getLayoutInflater().inflate(R.layout.marker_layout, null);
        ImageView EventImg = (ImageView)v.findViewById(R.id.eventimg);
        TextView EventTitel = (TextView)v.findViewById(R.id.eventtitel);
        TextView EventDesc = (TextView)v.findViewById(R.id.eventdescr);
        TextView EventDatum = (TextView)v.findViewById(R.id.eventdatum);
        TextView EventUhrzeit = (TextView)v.findViewById(R.id.eventuhrzeit);
        EventTitel.setText(Titel);
        EventDesc.setText(Beschreibung);
        EventDatum.setText(Datum);
        EventUhrzeit.setText(Uhrzeit);
        Picasso.with(KarteFire.this).load(Img).resize(54, 54).into(EventImg);
        return v;
      }
      @Override
      public View getInfoContents(Marker marker) {
        return null;
      }
    });
    EventMarker = mMap.addMarker(new MarkerOptions().position(new LatLng(getlat, getlong)));
  }
  @Override
  public void onChildChanged(DataSnapshot dataSnapshot, String s) {
  }
  @Override
  public void onChildRemoved(DataSnapshot dataSnapshot) {
  }
  @Override
  public void onChildMoved(DataSnapshot dataSnapshot, String s) {
  }
  @Override
  public void onCancelled(DatabaseError databaseError) {
  }
});

【问题讨论】:

    标签: android google-maps firebase google-maps-markers


    【解决方案1】:

    请在我们的代码中进行以下类型的更改,

    final DatabaseReference getlats = FirebaseDatabase.getInstance().getReference().child("Events");
    getlats.addChildEventListener(new ChildEventListener() {
      @Override
      public void onChildAdded(DataSnapshot dataSnapshot, String s) {
        final Map<String, String> value = (Map<String, String>)dataSnapshot.getValue();
    String getslat = value.get("latitude");
    String getslong = value.get("longitude");
    
    
    double getlat = Double.parseDouble(getslat);
    double getlong = Double.parseDouble(getslong);
    
    mMap.setInfoWindowAdapter(new GoogleMap.InfoWindowAdapter() {
      @Override
      public View getInfoWindow(Marker marker) {
    final Map<String, String> value = (Map<String, String>)marker.getTag();
    final String Img = value.get("EventImg");
    final String Titel = value.get("Title");
    final String Beschreibung = value.get("Desc");
    final String Datum = value.get("Datum");
    final String Uhrzeit = value.get("Uhrzeit");
    
        View v = getLayoutInflater().inflate(R.layout.marker_layout, null);
        ImageView EventImg = (ImageView)v.findViewById(R.id.eventimg);
        TextView EventTitel = (TextView)v.findViewById(R.id.eventtitel);
        TextView EventDesc = (TextView)v.findViewById(R.id.eventdescr);
        TextView EventDatum = (TextView)v.findViewById(R.id.eventdatum);
        TextView EventUhrzeit = (TextView)v.findViewById(R.id.eventuhrzeit);
        EventTitel.setText(Titel);
        EventDesc.setText(Beschreibung);
        EventDatum.setText(Datum);
        EventUhrzeit.setText(Uhrzeit);
        Picasso.with(KarteFire.this).load(Img).resize(54, 54).into(EventImg);
        return v;
      }
      @Override
      public View getInfoContents(Marker marker) {
        return null;
      }
    });
    EventMarker = mMap.addMarker(new MarkerOptions().position(new LatLng(getlat, getlong)));
    EventMarker.setTag(value);
      }
      @Override
      public void onChildChanged(DataSnapshot dataSnapshot, String s) {
      }
      @Override
      public void onChildRemoved(DataSnapshot dataSnapshot) {
      }
      @Override
      public void onChildMoved(DataSnapshot dataSnapshot, String s) {
      }
      @Override
      public void onCancelled(DatabaseError databaseError) {
      }
    });
    

    【讨论】:

    • 地图上设置标记的行有错误。我删除了代码 setTag(value)。但是当我点击标记时它崩溃了
    • 如果我在 Markeroptions .setTitle(Titel) 中设置字符串标题,它可以工作,但如果我想用 xml 槽 onInfoWindow 方法设置它,它就不起作用
    • 使用 setTag(value) 时出现什么错误,也许我已经编辑了答案。请看一看。
    • 天哪!你是神!你为我节省了很多时间!太感谢了。祝你有美好的一天。
    猜你喜欢
    • 2016-07-27
    • 2013-09-02
    • 2016-07-09
    • 2013-06-08
    • 1970-01-01
    • 2013-04-17
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多