私はfirebaseでアンドロイド用のアプリを作っています。私は何をしようとしていることは、すべてのノードは、レベル番号を持っているということです。FirebaseでAndroidの非同期処理を処理する方法
User---
|
---> Jamse---
| |
| ---> Level = 0
---> Taylor---
|
----> Level = 1
私はすべてのノードを横断し、ArrayListの中にレベル番号を保存します。しかし、問題は、レベル番号でいっぱいのArrayListはfirebaseListener関数内にしか存在できないということです。関数の外では、ArrayListは空です。誰も私にこの問題を解決する方法のアドバイスを与えることができますか?
コード:
private ArrayList<Integer> parentLevel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_linked_people_tree);
LinearLayout linked = (LinearLayout) findViewById(R.id.linkedlayoutid);
mFirebaseAuth = FirebaseAuth.getInstance();
users = mFirebaseAuth.getCurrentUser();
mDatabaseReference = FirebaseDatabase.getInstance().getReference();
parentLevel = new ArrayList<Integer>();
mDatabaseReference.child("Users").child(users.getUid()).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if(dataSnapshot.child("OriginalUser").child("Parents").hasChildren()) {
DataSnapshot parentSnapshot = dataSnapshot;
int level = 0;
relatedParentNodeFinder(parentSnapshot, users.getUid(), level);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
最高レベルを見つける機能:
void relatedParentNodeFinder(DataSnapshot parentSnapshot, String userID, int level) {
if(userID.equals(users.getUid())) {
if (parentSnapshot.child("OriginalUser").child("Parents").exists()) {
mDatabaseReference.child("Users").child(users.getUid()).child("OriginalUser").child("Level").setValue(level);
level++;
for (DataSnapshot postSnapshot : parentSnapshot.child("OriginalUser").child("Parents").getChildren()) {
relatedParentNodeFinder(parentSnapshot, postSnapshot.getValue().toString(), level);
}
}
} else if(parentSnapshot.child("FamilyMembers").child(userID).child("Parents").exists()) {
if(parentSnapshot.child("FamilyMembers"). child(userID).child("Parents").exists()) {
mDatabaseReference.child("Users").child(users.getUid()).child("FamilyMembers")
.child(userID).child("Level").setValue(level);
level++;
for(DataSnapshot postSnapshot : parentSnapshot.child("FamilyMembers").child(userID).child("Parents").getChildren()) {
relatedParentNodeFinder(parentSnapshot, postSnapshot.getValue().toString(), level);
}
}
} else { //Has the Key of the Top Parent Nodes
mDatabaseReference.child("Users").child(users.getUid()).child("FamilyMembers")
.child(userID).child("Level").setValue(level);
//------> parentLevel.add(level); //THIS IS THE ARRAYLIST. I CANT MAKE IT WORK OUTSIDE OF THE LISTENER
topDownChildNodeFinder(parentSnapshot, userID, level);
}
}
なぜあなたはコールバックの外でArraylistを使用しようとしていますか?あなたのArraylistは間違いなくリスナーの外に存在することができます。あなたのコードを追加してください –
私はコードを追加 –
parentLevel.add(レベル); arraylistにレベル番号を追加しますが、メインのfirebase listenerの後にアクセスしようとすると、それはemoty配列として表示されます –