2017-04-06 68 views
0

我在Android應用程序中使用Firebase ValueEventlistener從數據庫中檢索一些數據以初始化我的用戶界面,但我的問題是,我永遠不知道數據提取何時完成,取決於用戶的Internet連接速度,我爲Listeners完成獲取數據的延遲時間爲5秒,但有時這還不夠,並且數據仍然爲空,從而產生空指針異常。我想知道Firebase偵聽器何時完成抓取數據以更新我的用戶界面。如何檢測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) { 

     } 
    }); 
} 

在這裏,我試圖讓從火力地堡聽衆的數據一個ArrayList能夠通過傳遞的ArrayList到的一個適配器來初始化UI列表顯示。

任何人都有這方面的解決方案嗎?

+0

Firebase偵聽器同步數據,因此他們嚴格來說從未完成。另一方面:每次'onDataChange'觸發時,您都會從數據庫中獲取一組完整的數據 - 因此您可以將每個數據都視爲「已完成」。如果您分享[重現您卡住的最小代碼](http://stackoverflow.com/help/mcve),則可能更容易幫助您。 –

+0

@FrankvanPuffelen我編輯了代碼並添加了代碼片段,請看看 –

回答

2

執行onDataChanged()方法內的所有用戶界面更新如下:

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) { 

       } 
      }); 

我的適配器類低於

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

}

請不要忘了,就把這行marketArrayAdapter.notifyDataSetChanged();

+0

這幾乎解決了我的問題。非常感謝! –

相關問題