Android 无法正确迭代firebase实时数据库

Android 无法正确迭代firebase实时数据库,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,我是android studio和firebase的新手,从firebase实时数据库检索特定键值时遇到问题 因此,我在firebase实时数据库中有一个用户数组,我想遍历整个数组,但每次按下“下一步”按钮直到数组结束时,我都会“移动”迭代器一次 它不是静态的,也就是说,数组的大小可以更改 当我移动迭代器时(当我按下按钮时),我想从firebase实时数据库中获取该用户的“状态”消息(第一次按下按钮时,下一个迭代器将为1,我想获取该用户的状态消息,该用户的键为1,依此类推) 抱歉,它不允许我发布

我是android studio和firebase的新手,从firebase实时数据库检索特定键值时遇到问题

因此,我在firebase实时数据库中有一个用户数组,我想遍历整个数组,但每次按下“下一步”按钮直到数组结束时,我都会“移动”迭代器一次

它不是静态的,也就是说,数组的大小可以更改

当我移动迭代器时(当我按下按钮时),我想从firebase实时数据库中获取该用户的“状态”消息(第一次按下按钮时,下一个迭代器将为1,我想获取该用户的状态消息,该用户的键为1,依此类推)

抱歉,它不允许我发布图片

我的firebase数据库的链接:

下面的代码可以工作,但它总是返回最后一个加入数组的用户的“status”值

我的代码如下所示:

next.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        if(current_person < number_of_people_in_the_row){
            current_person++;

            current_person.setText(String.valueOf(current_person));

            final String current_person_string = String.valueOf(current_person );

            DatabaseReference user = db.getReference("Redovi").child("Aktivni").child(pin);
            user.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                    for(DataSnapshot current_user: dataSnapshot.getChildren()){
                        current_user.child(current_person_string);

                        for(DataSnapshot current_user_data: current_user.getChildren()){
                            String current_user_status = current_user_data.child("status").getValue().toString();

                            Toast.makeText(RedomatAdmin.this, current_user_status, Toast.LENGTH_SHORT).show();

                        }
                    }
                }

                @Override
                public void onCancelled(@NonNull DatabaseError databaseError) {

                }
            });
        }
    }
});

next.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
if(当前人数<行中人数){
当前_person++;
current_person.setText(String.valueOf(current_person));
最终字符串current\u person\u String=String.valueOf(current\u person);
DatabaseReference user=db.getReference(“Redovi”).child(“Aktivni”).child(pin);
user.addListenerForSingleValueEvent(新的ValueEventListener()){
@凌驾
public void onDataChange(@NonNull DataSnapshot DataSnapshot){
对于(DataSnapshot当前用户:DataSnapshot.getChildren()){
当前用户.child(当前用户\u字符串);
对于(DataSnapshot当前用户数据:当前用户.getChildren()){
字符串current_user_status=current_user_data.child(“status”).getValue().toString();
Toast.makeText(redomataadmin.this,当前用户状态,Toast.LENGTH\u SHORT.show();
}
}
}
@凌驾
已取消的公共void(@NonNull DatabaseError DatabaseError){
}
});
}
}
});

您正在数据上循环,并在其中显示特定节点的toast。但是,由于您的代码执行速度非常快,您可能只会看到代码生成的最后一个吐司

Toast消息对于调试来说不太好,因此我强烈建议为此切换到
Log
调用。在下面的代码中,我做了两个更改:

  • 循环完成后,仅显示包含所有数据的单个toast消息
  • 记录每个循环的值,以便在logcat输出中找到它们

  • 更好的方法是学习在Android Studio中使用交互式调试器,在
    onDataChange
    中设置一个断点,然后逐步浏览代码,以更轻松的速度查看发生了什么。:)

    “始终返回”最后一个加入阵列的用户的“状态”值是什么意思?你只得到一个结果?@Karlo你每次按下按钮都会得到一个结果,或者当一个新用户加入阵列时,你只会得到Toast消息?@AlexMamo在我发布的图片中,我有5个用户,每次单击“下一步”按钮,我都会得到阵列中第5个用户的Toast“状态”,如果我要再添加3个用户,并手动将数据库中第8个用户的状态更改为“非活动”,我将始终只获取该第8个用户的状态。@P5music当我按下“下一步”按钮时,我希望获取该用户的“状态”消息(因此该特定用户的单个状态消息),这里我使用toast只是为了检查我是否得到了正确的值。@Karlo如果您的代码片段只是一个检查,那么toast似乎是在您手动更改值时发出的,因此它是最后一个值。如果没有提供真实代码,请提供原始代码或代码片段。
    DatabaseReference user = db.getReference("Redovi").child("Aktivni").child(pin);
    user.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            String toast = "";
            for(DataSnapshot current_user: dataSnapshot.getChildren()){
                String current_user_key = current_user.getKey();
                Log.d("NEXT", "Handling user "+current_user_key);
                for(DataSnapshot current_user_data: current_user.getChildren()){
                    String current_user_status = current_user_data.child("status").getValue().toString();
    
                    Log.d("NEXT", "Handling data "+current_user_data.getKey()+" status="+current_user_status);
    
                    toast = toast + current_user_key + " = " + current_user_status + ", ";
                }
            }
            Toast.makeText(RedomatAdmin.this, toast, Toast.LENGTH_SHORT).show();
        }
    
        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            throw databaseError.toException(); // don't ignore errors please
        }
    });