【问题标题】:Passing Firebase information through putExtra in InfoWindow OnClickListener通过 InfoWindow OnClickListener 中的 putExtra 传递 Firebase 信息
【发布时间】:2017-06-01 05:30:53
【问题描述】:

所以我有这段代码可以从我的 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);
        }
    });

现在我的问题是,我点击的每个 InfoWindow,信息总是显示我从数据库中获取的最后一个数据。例如,我单击了 A 的地点标记信息窗口,但最后从数据库中获取的数据是 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"));

关于如何解决它的任何想法?

【问题讨论】:

    标签: android google-maps android-intent firebase-realtime-database infowindow


    【解决方案1】:

    您正在使用 for 循环获取从 firebase 接收的数据列表,并且您正在将值更新为字符串和双精度值。因此它将继续替换最后一个值,您的最​​终值将是您将获取的最后一个数据的值。要解决此问题,您可以使用 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;
    }
    

    }

    在您的 onDataChange 上,使用 HashMap 以标记作为键存储 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);
        }
    

    【讨论】:

    • detailMarkerMap.put(marker, detail);给我 NullPointerException。更改了私有 HashMap detailMarkerMap; to HashMap detailMarkerMap = new HashMap();让它工作。非常感谢!
    • 欢迎 :) +1 将不胜感激 ;)
    猜你喜欢
    • 1970-01-01
    • 2013-05-08
    • 1970-01-01
    • 2013-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-02
    • 2016-02-17
    相关资源
    最近更新 更多