通过 InfoWindow OnClickListener 中的 putExtra 传递 Firebase 信息
Passing Firebase information through putExtra in InfoWindow OnClickListener
所以我有这段代码可以从我的 Firebase 数据库中获取数据。然后,我把它放在变量中。标记是使用变量制作的。这些变量也将被使用,通过 onInfoWindowClickListener 中的 putExtra 传递信息。
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);
}
});
现在我的问题是,我单击的每个信息窗口,信息总是显示我从数据库中获取的最后数据。比如我点了A的地标InfoWindow,但是最后从数据库中取出的数据是E的地标。因此,当 DetailsActivity 使用 getExtras() 时,它会显示 E 的位置信息,而不是 A 的。这也发生在C和D的标记处。
这是 DetailsActivity 的代码:
Intent detailsIntent = getIntent();
placeTitle.setText(detailsIntent.getStringExtra("Judul"));
placeAddress.setText(detailsIntent.getStringExtra("Alamat"));
placeNumber.setText(detailsIntent.getStringExtra("Harga"));
placePrice.setText(detailsIntent.getStringExtra("NomorTelepon"));
有什么解决办法吗?
您正在对从 firebase 接收的数据列表使用 for 循环,并将值更新为字符串和双精度。所以它会不断替换最后一个值,你的最终值将是你将获取的最后一个数据的值。要解决此问题,您可以使用 HashMap
首先为标记细节创建一个模型class
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;
}
}
并且在您的 onDataChange 上使用 HashMap 存储以 Marker 为键的 Detail 对象。这样,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);
}
}
在你的OnInfoWindowClick上通过按键标记获取详细信息
@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);
}
所以我有这段代码可以从我的 Firebase 数据库中获取数据。然后,我把它放在变量中。标记是使用变量制作的。这些变量也将被使用,通过 onInfoWindowClickListener 中的 putExtra 传递信息。
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);
}
});
现在我的问题是,我单击的每个信息窗口,信息总是显示我从数据库中获取的最后数据。比如我点了A的地标InfoWindow,但是最后从数据库中取出的数据是E的地标。因此,当 DetailsActivity 使用 getExtras() 时,它会显示 E 的位置信息,而不是 A 的。这也发生在C和D的标记处。
这是 DetailsActivity 的代码:
Intent detailsIntent = getIntent();
placeTitle.setText(detailsIntent.getStringExtra("Judul"));
placeAddress.setText(detailsIntent.getStringExtra("Alamat"));
placeNumber.setText(detailsIntent.getStringExtra("Harga"));
placePrice.setText(detailsIntent.getStringExtra("NomorTelepon"));
有什么解决办法吗?
您正在对从 firebase 接收的数据列表使用 for 循环,并将值更新为字符串和双精度。所以它会不断替换最后一个值,你的最终值将是你将获取的最后一个数据的值。要解决此问题,您可以使用 HashMap
首先为标记细节创建一个模型class
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;
}
}
并且在您的 onDataChange 上使用 HashMap 存储以 Marker 为键的 Detail 对象。这样,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);
}
}
在你的OnInfoWindowClick上通过按键标记获取详细信息
@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);
}