Android 通过ID列表获取元素然后在listview上显示它们的正确方法是什么-Firebase安卓

Android 通过ID列表获取元素然后在listview上显示它们的正确方法是什么-Firebase安卓,android,firebase,listview,firebase-realtime-database,Android,Firebase,Listview,Firebase Realtime Database,根据文档,当涉及数据库关系时,我们应该避免嵌套数据。因此,我的数据结构如下: { "rides": { "ride1": { "price": "500", "bids": { // the value here doesn't matter, just that the key exists "bid1": true, "bid2": true } }, ... },

根据文档,当涉及数据库关系时,我们应该避免嵌套数据。因此,我的数据结构如下:

{
  "rides": {
    "ride1": {
      "price": "500",
      "bids": {
         // the value here doesn't matter, just that the key exists
         "bid1": true,
         "bid2": true
      }
    },
    ...
  },
  "bids": {
    "bid1": {
      "price": "550",
      "ride": "ride1"
    },
    ...
  }
}
在我的应用程序的一个页面中,用户应该能够在列表视图中看到链接到所选“骑乘”的所有“出价”。我的尝试是:在arrayList中获取出价的键,然后逐个按键获取出价。我的问题是,我必须一次在列表视图中显示所有出价

   bidsListener = new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                ArrayList<String> bidskeysOfActiveRideArrayList = new ArrayList<>();
                for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                    Boolean IsbidLinkedToThisRid = snapshot.getValue(Boolean.class);
                    if (IsbidLinkedToThisRid) {
                        String bidObjectId = dataSnapshot.getKey();
                        bidskeysOfActiveRideArrayList.add(bidObjectId);
                    }
                }
                fetchMultipleBidsByKeys(bidskeysOfActiveRideArrayList);
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        };
        databaseReference.child("rides").child(ride.getID()).child("bids").addValueEventListener(bidsListener);
bidsListener=newvalueeventlistener(){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
ArrayList bidskeysOfActiveRideArrayList=新ArrayList();
对于(DataSnapshot快照:DataSnapshot.getChildren()){
Boolean IsbidLinkedToThisRid=snapshot.getValue(Boolean.class);
if(IsbidLinkedToThisRid){
字符串bidObjectId=dataSnapshot.getKey();
添加(bidObjectId);
}
}
获取MultipleBidByKeys(BidSkeySofActivifiedAryList);
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
}
};
databaseReference.child(“rides”).child(ride.getID()).child(“bids”).addValueEventListener(bidsListener);
这里有两个功能:

private void fetchMultipleBidsByKeys(ArrayList<String> bidskeysOfActiveRideArrayList) {
        ArrayList<Bid> bidsArrayList = new ArrayList<>();

        for (String bid_id:bidskeysOfActiveRideArrayList){
            bidsArrayList.add(getBidByKey(bid_id));
        }
        displayBidList(bidsArrayList);
    }

    private Bid getBidByKey(String bidObjectId) {
        final Bid[] bidFetched = {null};
        ValueEventListener bidsSingleFetcher = new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                    bidFetched[0] = snapshot.getValue(Bid.class);
                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        };
        databaseReference.child("bids").child(bidObjectId).addListenerForSingleValueEvent(bidsSingleFetcher);
        return bidFetched[0];
    }
private void fetchMultipleBidByKeys(ArrayList BidsKeysofActiveriDearyList){
ArrayList bidsArrayList=新的ArrayList();
for(字符串bid\u id:bidskeysOfActiveRideArrayList){
添加(getBidByKey(bid_id));
}
显示投标一览表(投标一览表);
}
私人出价getBidByKey(字符串bidObjectId){
最终出价[]bidFetched={null};
ValueEventListener bidsSingleFetcher=新的ValueEventListener(){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
对于(DataSnapshot快照:DataSnapshot.getChildren()){
bidFetched[0]=snapshot.getValue(Bid.class);
}
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
}
};
databaseReference.child(“bids”).child(bidObjectId).addListenerForSingleValueEvent(bidsSingleFetcher);
返回已获取的[0];
}

但是,firebase数据获取是异步的。那么,通过ID列表获取元素然后在listview上显示它们的正确方法是什么呢

的可能重复项请检查重复项以了解如何解决
onDataChange()
方法的异步行为。