2017-05-13 4 views
0

Firebaseからデータを取得し、このデータをカスタマイズされたInfoWindow内に表示しようとしています。ここに私のコードは次のとおりです。MapのInfoWindowはFirbase addValueEventListenerに更新されません

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; 
     } 
    }); 

このコードは無効onMapReady(GoogleMap googleMap)メソッドの内部にあります。

事実、System.out.println()はFirebaseのデータを表示しますが、TextViewには表示されません。表示されるテキストは「TextView」です(デフォルトではテキストは、データベースから取得している新しい情報に変更されません。setTextが実行されなかったかのようなものです...)

私が間違っていることはありますか? お手伝いができれば本当にありがとう。ありがとう。

答えて

0

この問題は、InfoWindowが「ライブビュー」ではなく、Firebaseからのデータを取得する非同期性が原因であると考えられます。 InfoWindowのドキュメントの状態:

注:描画される情報ウィンドウはライブビューではありません。ビューは、 が返された時点で、画像としてレンダリングされた です(View.draw(Canvas)を使用)。これは、その後のビューの変更が、 が地図上の情報ウィンドウに反映されないことを意味します。後で情報ウィンドウ を更新するには(たとえば、画像が読み込まれた後に)、showInfoWindow()を呼び出します。

onDataChange()が実行される前にビューがレンダリングされ、TextViewsの内容が設定されます。ドキュメントの提案、次の試してみて、showInfoWindow()onDataChange()内で呼び出す:getInfoContents(final Marker marker):あなたはおそらくも最終を作る必要があるでしょう

@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 
} 

関連する問題