2017-07-15 85 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。 –

相关问题