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()
方法的异步行为。