0

このコードでは、Firebaseデータベースからデータを取得します。そしてそれを変数に入れました。マーカーは変数を使用して作成されます。これらの変数は、onInfoWindowClickListenerのputExtraを使って情報を渡すためにも使用されます。InfoWindowのputExtraを介してFirebase情報を渡すOnClickListener

DatabaseReference myRef = FirebaseDatabase.getInstance().getReference(); 
    myRef.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      int ikonLokasi = 0; 
      for(DataSnapshot child : dataSnapshot.child("places").getChildren()) 
      { 
       latitude_ = child.child("latitude").getValue(Double.class); 
       longitude_ = child.child("longitude").getValue(Double.class); 
       nama_tempat = child.child("nama").getValue(String.class); 
       kategori = child.child("kategori").getValue(String.class); 
       alamat = child.child("alamat").getValue(String.class); 
       harga = child.child("harga").getValue(String.class); 
       nomor_telepon = child.child("nomor_telepon").getValue(String.class); 

       . 
       . 
       . 

       LatLng latlng = new LatLng(latitude_, longitude_); 
       googleMap.addMarker(new MarkerOptions() 
         .position(latlng) 
         .title(nama_tempat) 
         .icon(BitmapDescriptorFactory.fromResource(ikonLokasi)) 
         .snippet(alamat)); 
      } 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 

    . 
    . 
    . 

    googleMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() { 

     @Override 
     public boolean onMarkerClick(Marker marker) { 
      marker.showInfoWindow(); 
      return true; 
     } 
    }); 

    googleMap.setOnInfoWindowClickListener(new GoogleMap.OnInfoWindowClickListener() { 
     @Override 
     public void onInfoWindowClick(Marker marker) { 
      marker.getTitle(); 
      Intent mainIntent = new Intent(getActivity(),DetailsActivity.class); 
      mainIntent.putExtra("Judul", nama_tempat); 
      mainIntent.putExtra("Alamat", alamat); 
      mainIntent.putExtra("Harga", harga); 
      mainIntent.putExtra("NomorTelepon", nomor_telepon); 
      getActivity().startActivity(mainIntent); 
     } 
    }); 

私の問題は、InfoWindowがクリックするたびに、情報が常にデータベースから取得した最後のデータを表示していることです。たとえば、Aの場所マーカーInfoWindowをクリックしましたが、データベースから最後にフェッチされたデータはEの場所マーカーです。したがって、DetailsActivityがgetExtras()を使用すると、Aの場所情報ではなくEの場所情報が表示されます。これはCとDのマーカーでも起こりました。それを解決する方法について

Intent detailsIntent = getIntent(); 
    placeTitle.setText(detailsIntent.getStringExtra("Judul")); 
    placeAddress.setText(detailsIntent.getStringExtra("Alamat")); 
    placeNumber.setText(detailsIntent.getStringExtra("Harga")); 
    placePrice.setText(detailsIntent.getStringExtra("NomorTelepon")); 

任意のアイデア:

ここDetailsActivityためのコードですか?

答えて

0

firebaseから受け取ったデータのリストをforループで使用していて、値をstringとdoubleに更新しています。したがって、最後の値を置き換えずに保存し、最後の値は最後に取得するデータの値になります。これを解決するには、HashMapの

まず、マーカーの詳細

public class Detail{ 
private double latitude; 
private double longitude; 
private String nama_tempat; 
private String kategori; 
private String alamat; 
private String harga; 
private String nomor_telepon; 

public Detail(double latitude, double longitude, String nama_tempat, String kategori, String alamat, String harga, String nomor_telepon) { 
    this.latitude = latitude; 
    this.longitude = longitude; 
    this.nama_tempat = nama_tempat; 
    this.kategori = kategori; 
    this.alamat = alamat; 
    this.harga = harga; 
    this.nomor_telepon = nomor_telepon; 
} 

public double getLatitude() { 
    return latitude; 
} 

public void setLatitude(double latitude) { 
    this.latitude = latitude; 
} 

public double getLongitude() { 
    return longitude; 
} 

public void setLongitude(double longitude) { 
    this.longitude = longitude; 
} 

public String getNama_tempat() { 
    return nama_tempat; 
} 

public void setNama_tempat(String nama_tempat) { 
    this.nama_tempat = nama_tempat; 
} 

public String getKategori() { 
    return kategori; 
} 

public void setKategori(String kategori) { 
    this.kategori = kategori; 
} 

public String getAlamat() { 
    return alamat; 
} 

public void setAlamat(String alamat) { 
    this.alamat = alamat; 
} 

public String getHarga() { 
    return harga; 
} 

public void setHarga(String harga) { 
    this.harga = harga; 
} 

public String getNomor_telepon() { 
    return nomor_telepon; 
} 

public void setNomor_telepon(String nomor_telepon) { 
    this.nomor_telepon = nomor_telepon; 
} 

}

のためにそして、あなたがキーとしてマーカーで店舗にDetailオブジェクトをHashMapを使用OnDataChangeの上でモデルクラスを作成して使用することができます。そうすることで、Markerはオブジェクトにリンクされます。あなたに

private HashMap<Marker, Detail> detailMarkerMap; 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     int ikonLokasi = 0; 
     for(DataSnapshot child : dataSnapshot.child("places").getChildren()) 
     { 
      latitude_ = child.child("latitude").getValue(Double.class); 
      longitude_ = child.child("longitude").getValue(Double.class); 
      nama_tempat = child.child("nama").getValue(String.class); 
      kategori = child.child("kategori").getValue(String.class); 
      alamat = child.child("alamat").getValue(String.class); 
      harga = child.child("harga").getValue(String.class); 
      nomor_telepon = child.child("nomor_telepon").getValue(String.class); 

      Detail detail = new Detail(latitude_, longitude_, nama_tempat, kategori, alamat, harga, nomor_telepon); 



      . 
      . 
      . 

      LatLng latlng = new LatLng(latitude_, longitude_); 
      Marker marker = googleMap.addMarker(new MarkerOptions() 
      .position(latlng) 
      .title(nama_tempat) 
      .icon(BitmapDescriptorFactory.fromResource(ikonLokasi)) 
      .snippet(alamat)); 

      detailMarkerMap.put(marker, detail); 
     } 
    } 

はキーマーカー

@Override 
    public void onInfoWindowClick(Marker marker) { 
     marker.getTitle(); 

     Detail detail = detailMarkerMap.get(marker); 

     Intent mainIntent = new Intent(getActivity(),DetailsActivity.class); 
     mainIntent.putExtra("Judul", detail.getNama_tempat()); 
     mainIntent.putExtra("Alamat", detail.getAlamat()); 
     mainIntent.putExtra("Harga", detail.getHarga()); 
     mainIntent.putExtra("NomorTelepon", detail.getNomor_telepon()); 
     getActivity().startActivity(mainIntent); 
    } 
+0

detailMarkerMap.put(マーカー、詳細)で詳細を取得しますOnInfoWindowClick。私にNullPointerExceptionを与えます。プライベートHashMapを変更しました。 detailMarkerMap; HashMap <マーカー、DetailsModel> detailMarkerMap =新しいHashMap <>();それがうまくいった。どうもありがとう! –

+0

ようこそ:) +1されます;) –

関連する問題