2017-07-15 80 views
0

我有一些touble用下面的代碼剪斷:android - 從datasnapshot返回Firebase值爲什麼?

mCevap.child(post_key).addListenerForSingleValueEvent(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     size = (int) dataSnapshot.getChildrenCount(); 
    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) { 
    } 
}); 
viewHolder.setCount(size); 

大小返回null,但我不明白爲什麼。我想要將計數值傳遞給recyclerview。

+0

安置自己的數據庫結構,什麼mCevap是 –

+0

這裏是我要回'是什麼尺寸'。但你總是轉向零。如果我用「吐司」打印它,它會正常反映。 –

回答

0

數據是從Firebase異步加載的。這意味着您的代碼執行的順序並不是您可能期望的。

System.out.println("Before addListenerForSingleValueEvent"); 
mCevap.child(post_key).addListenerForSingleValueEvent(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     System.out.println("In onDataChange"); 
    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) { 
     throw databaseError.toException(); // don't ignore errors 
    } 
}); 
System.out.println("After addListenerForSingleValueEvent"); 

的這個輸出是:你可以很容易地添加一些日誌語句代碼中看到這個

之前addListenerForSingleValueEvent

後addListenerForSingleValueEvent

在onDataChange

這可能不是你所期望的!數據是從Firebase異步加載的。而不是等待它返回(這會導致「應用程序未響應」對話框),該方法繼續。然後,當數據可用時,您的onDataChange被調用。

爲了使程序工作,你需要移動需要的數據爲onDataChange方法的代碼:

mCevap.child(post_key).addListenerForSingleValueEvent(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     System.out.println("size ="+dataSnapshot.getChildrenCount()); 
    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) { 
     throw databaseError.toException(); // don't ignore errors 
    } 
}); 
+0

如何將其轉移到在RecycleView中也可以找到的TextView。 –

相關問題