2017-04-06 34 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

这几乎解决了我的问题。非常感谢! –

相关问题