在标记中显示信息

Showing information in markers

我想显示从火力基地检索到的每个标记的信息 database.But 我无法使用代码片段,因为有很多信息,例如图像和电子邮件 ID。我尝试使用 Infowindo,但对于所有标记,只显示最新数据的信息。

mUsers.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            for (DataSnapshot s : dataSnapshot.getChildren()) {
                final member user = s.getValue(member.class);
                LatLng location = new LatLng(user.lat, user.lon);
                mMap.setInfoWindowAdapter(new GoogleMap.InfoWindowAdapter() {
                    @Override
                    public View getInfoWindow(Marker marker) {
                        return null;
                    }

                    @Override
                    public View getInfoContents(Marker marker) {
                        View v= getLayoutInflater().inflate(R.layout.coustume,null);
                        TextView nam=v.findViewById(R.id.name);
                        TextView emai=v.findViewById(R.id.email);
                        TextView famy=v.findViewById(R.id.family);
                        TextView seed=v.findViewById(R.id.plant);
                        ImageView image=v.findViewById(R.id.imagev);
                        nam.setText(user.name);
                        Picasso.get().load(user.imagepath).into(image);
                        emai.setText("Email ID:"+user.email);
                        famy.setText("Family Members:  " + user.numbf);
                        seed.setText("Plants:    " +user.numbs);
                        LatLng location = new LatLng(user.lat, user.lon);
                        mMap.addMarker(new MarkerOptions().position(location).title(user.name)).setIcon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_YELLOW));

                        return v;
                    }
                });

                mMap.addMarker(new MarkerOptions().position(location).title(user.name)).setIcon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_YELLOW));


            }
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });`

这是我的最终输出,当我点击下一个标记时信息是相同的,它不会改变

final member user = s.getValue(member.class); 您将用户变量设置为最终变量。这意味着它的值在初始化后不会改变,因此它将始终拥有相同的用户。尝试删除 final 关键字。

这个循环的每一步:

...
for (DataSnapshot s : dataSnapshot.getChildren()) {
            final member user = s.getValue(member.class);
            LatLng location = new LatLng(user.lat, user.lon);
            mMap.setInfoWindowAdapter(new GoogleMap.InfoWindowAdapter() {
                @Override
                public View getInfoWindow(Marker marker) {
                    return null;
                }
                ...
             }
    mMap.addMarker(new MarkerOptions().position(location).title(user.name)).setIcon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_YELLOW));
}
...

为信息 window 的内容设置一个新的自定义渲染器 (InfoWindowAdapter)(之前的内容已被替换)并且 user 对象对所有标记都相同。为避免您需要将 user 对象存储在相应标记的 tag 字段中,然后,当标记为单击时,从准确单击的标记 tag 字段中获取 user 对象。类似的东西:

...
for (DataSnapshot s : dataSnapshot.getChildren()) {
    final member user = s.getValue(member.class);
    LatLng location = new LatLng(user.lat, user.lon);

    Marker marker = mMap.addMarker(new MarkerOptions().position(location).title(user.name));
    marker.setIcon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_YELLOW));
    marker.setTag(user);  // <--- store user object at marker tag
}

// move it outside of loop
mMap.setInfoWindowAdapter(new GoogleMap.InfoWindowAdapter() {
    @Override
    public View getInfoWindow(Marker marker) {
        return null;
    }
    @Override
    public View getInfoContents(Marker marker) {
        // get object user from marker tag and cast it to "member" class
        final member user = (member) (marker.getTag());

        View v= getLayoutInflater().inflate(R.layout.coustume,null);
        TextView nam = v.findViewById(R.id.name);
        TextView emai = v.findViewById(R.id.email);
        TextView famy = v.findViewById(R.id.family);
        TextView seed = v.findViewById(R.id.plant);
        ImageView image=v.findViewById(R.id.imagev);
        nam.setText(user.name);
        Picasso.get().load(user.imagepath).into(image);
        emai.setText("Email ID:"+user.email);
        famy.setText("Family Members:  " + user.numbf);
        seed.setText("Plants:    " +user.numbs);
        LatLng location = new LatLng(user.lat, user.lon);

        // remove line below to avoid marker "re-creation" on every getInfoContents() call
        //mMap.addMarker(new MarkerOptions().position(location).title(user.name)).setIcon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_YELLOW));

        return v;
    }
}
...

您还需要删除行:

mMap.addMarker(new MarkerOptions().position(location).title(user.name)).setIcon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_YELLOW));

public View getInfoContents(Marker marker) { 方法避免在同一位置创建多个标记。

此外,class 名称使用大写会更好:member -> Member.