Map的InfoWindow不会更新到Firebase addValueEventListener

时间:2017-05-13 18:15:05

标签: android firebase

我正在尝试从Firebase获取数据并在自定义InfoWindow中显示此数据。这是我的代码:

    map.setInfoWindowAdapter(new GoogleMap.InfoWindowAdapter(){
        @Override
        public View getInfoWindow(Marker marker) {
            return null;
        }

        @Override
        public View getInfoContents(Marker marker) {

            View v = getActivity().getLayoutInflater().inflate(R.layout.info_window, null);
            final TextView tv = (TextView) v.findViewById(R.id.textView);
            final TextView tv2 = (TextView) v.findViewById(R.id.textView2);

                nRef = new Firebase("https://mydatabase-98057.firebaseio.com/Object");
                nRef.addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        System.out.println("hello : "+dataSnapshot.toString());
                        tv.setText("Spots available : "+dataSnapshot.toString());
                        tv2.setText("Spots available : "+dataSnapshot.toString());
                    }

                    @Override
                    public void onCancelled(FirebaseError firebaseError) {

                    }
                });

            return v;
        }
    });

此代码位于void onMapReady(GoogleMap googleMap)方法内。

事情是System.out.println()显示应该来自Firebase的数据,但TextViews不显示它,它们显示的唯一文本是“TextView”,默认情况下(它意味着文本不会更改为我从数据库中获取的新信息,就像setText没有运行或其他东西一样。)

1 个答案:

答案 0 :(得分:0)

我怀疑问题是由InfoWindow不是"直播视图"以及从Firebase获取数据的异步特性。 InfoWindow州的文档:

  

注意:绘制的信息窗口不是实时视图。观点是   在它的时候呈现为图像(使用View.draw(Canvas))   回。这意味着对视图的任何后续更改都不会   通过地图上的信息窗口反映出来。更新信息窗口   稍后(例如,在图像加载后),调用showInfoWindow()。

在您的情况下,视图在onDataChange()运行之前呈现并设置TextViews的内容。请尝试遵循文档中的建议,并在showInfoWindow()内调用onDataChange()

@Override
public void onDataChange(DataSnapshot dataSnapshot) {
    System.out.println("hello : "+dataSnapshot.toString());
    tv.setText("Spots available : "+dataSnapshot.toString());
    tv2.setText("Spots available : "+dataSnapshot.toString());
    marker.showInfoWindow(); // <== ADD THIS
}

您可能还需要制作marker final:getInfoContents(final Marker marker)