首页 > 解决方案 > 通过 ID 列表获取元素然后在列表视图上显示它们的正确方法是什么?-Firebase Android

问题描述

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

{
  "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"
    },
    ...
  }
}

在我的应用程序的一个页面中,用户应该能够看到链接到ListView中所选“乘车”的所有“出价” 。我的尝试是:在 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);

两个函数在这里:

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

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

标签: androidfirebaselistviewfirebase-realtime-database

解决方案


推荐阅读