2017-04-06 2 views
0

AndroidアプリケーションでFirebase ValueEventlistenerを使用してデータベースからデータを取得してUIを初期化していますが、データフェッチが完了してユーザーのインターネット接続の速度に依存するリスナーがデータの取得を終了するのに5秒間遅れますが、時には十分ではなく、データがヌルポインター例外を与えてもまだnullです。 Firebase ListenerがUIを更新できるようにデータを取得するタイミングを知りたい。Firebase Listenerがデータの取得を終了したかどうかを検出する方法は?

は、これは私がデータをフェッチする一つの方法である:ここで私はのアダプタにのArrayListを渡すことによって、UIを初期化できるようにするのArrayListにFirebaseリスナーからデータを取得しよう

 public void GetRequests(){ 

     Retrieve.addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
    Iterable<DataSnapshot> Games = dataSnapshot.getChildren(); 


      for(com.google.firebase.database.DataSnapshot game : Games){ 

       String Game_Key = game.child("GameKey").getValue(String.class); 
       String Game_Location = game.child("Location").getValue(String.class); 
       String UserID_Sender = game.child("UserID").getValue(String.class); 
       Adapter_Game_Key.add(Game_Key); 
       Adapter_UserID_Sender.add(UserID_Sender); 
      } 
     } 
     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 
} 

リストビュー。

誰にでも解決策がありますか?

+0

ファイアベースのリスナーはデータを同期するため、厳密に言えば決して終わらない。一方、 'onDataChange'が起動するたびに、データベースから完全なデータセットが得られます。そのため、それらのそれぞれを「完了」しておくことができます。あなたがどこにいるのかを再現する最小限のコードを共有すれば、おそらくあなたを助けるほうが簡単でしょう(http://stackoverflow.com/help/mcve)。 –

+0

@FrankvanPuffelenコードを編集してコードスニペットを追加しました。見てください –

答えて

2

次のようにonDataChanged()メソッド内のすべてのUIの更新を行います。私のアダプタクラスが

public MarketArrayAdapter(Context context, ArrayList<Ad> list) { 
    super(context, 0, list); 
} 

@NonNull 
@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

    final Ad ad = getItem(position); 
    if (convertView == null) { 
     convertView = LayoutInflater.from(getContext()).inflate(R.layout.ad_item, parent, false); 
    } 
    ImageView imageView = (ImageView) convertView.findViewById(R.id.ads_profile_pic); 
    TextView title = (TextView) convertView.findViewById(R.id.ads_title); 
    TextView price = (TextView) convertView.findViewById(R.id.ads_price); 
    TextView description = (TextView) convertView.findViewById(R.id.ads_short_description); 

    byte[] imageAsBytes = Base64.decode(ad.getaPictureUri().getBytes(), Base64.DEFAULT); 
    imageView.setImageBitmap(BitmapFactory.decodeByteArray(imageAsBytes, 0, imageAsBytes.length)); 
    title.setText(ad.getaTitle()); 
    price.setText(String.valueOf(ad.getaPrice())); 
    description.setText(ad.getaDescription()); 

    parent.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Intent in = new Intent(MarketActivity.this, ViewAdActivity.class); 
      in.putExtra("key", ad.getaId()); 
      startActivity(in); 
     } 
    }); 
    return convertView; 
} 

}

を下回っている

ArrayList<Ad> adArrayList_1 = new ArrayList<>(); 
    DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("ads"); 

    ListView listView_1 = (ListView) findViewById(R.id.market_list_view_1); 

    MarketArrayAdapter marketArrayAdapter = new MarketArrayAdapter(
      this, 
      adArrayList_1 
    ); 

    listView_1.setAdapter(marketArrayAdapter); 

      ref.addValueEventListener(new ValueEventListener() { 
       @Override 
       public void onDataChange(DataSnapshot dataSnapshot) { 
        adArrayList_1.clear(); 
        for(DataSnapshot snapshot : dataSnapshot.getChildren()){ 
         Ad ad = snapshot.getValue(Ad.class); 
         adArrayList_1.add(ad); 

        } 
        marketArrayAdapter.notifyDataSetChanged(); 
       } 

       @Override 
       public void onCancelled(DatabaseError databaseError) { 

       } 
      }); 

marketArrayAdapter.notifyDataSetChanged();

この行を置くことを忘れてはいけないしてください
+0

これは私の問題をほぼ解決しました。ありがとうございます! –

関連する問題