Java 保存在firebase数据库中但无法在listview中查看的聊天信息

Java 保存在firebase数据库中但无法在listview中查看的聊天信息,java,android,firebase,listview,firebase-realtime-database,Java,Android,Firebase,Listview,Firebase Realtime Database,对于我的聊天应用程序,我已将EditText数据保存到firebase,但我无法在ListView中显示相同的数据。我可以在Firebase数据库中看到EditText数据,我想在列表视图中检索它。有人能帮我吗 public class Chatbox extends AppCompatActivity { private DatabaseReference databaseReference; private Button btnsend; private Edit

对于我的聊天应用程序,我已将
EditText
数据保存到firebase,但我无法在
ListView
中显示相同的数据。我可以在Firebase数据库中看到
EditText
数据,我想在
列表视图中检索它。有人能帮我吗

public class Chatbox extends AppCompatActivity {

    private DatabaseReference databaseReference;

    private Button btnsend;
    private EditText editText;
    private ListView listView;

    private ArrayList<String> arrayList = new ArrayList<>();
    private ArrayAdapter<String> adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_chatbox);

        databaseReference = FirebaseDatabase.getInstance().getReference();

        adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, arrayList);

        btnsend = findViewById(R.id.sendbutton);
        editText = findViewById(R.id.typemessage);
        listView = findViewById(R.id.listmessages);

        btnsend.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                databaseReference.child("Chat").child("Name").push().setValue(editText.getText().toString());
            }
        });

        databaseReference.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                DatabaseReference chatreference=databaseReference.child("Chat");
                chatreference.addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                        try {
                            for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                                String chatmsg = snapshot.child("Name").getKey();
                                Toast.makeText(Chatbox.this, "keys " + chatmsg, Toast.LENGTH_SHORT).show();
                                arrayList.add(chatmsg);
                            }
                            listView.setAdapter(adapter);
                        }
                        catch (Exception ex)
                        {
                            Toast.makeText(Chatbox.this, "Error " + ex.getMessage(), Toast.LENGTH_SHORT).show();
                        }
                    }

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

                    }
                });

            }

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

            }
        });
公共类聊天室扩展了AppCompative活动{
私有数据库参考数据库参考;
私人按钮btnsend;
私人编辑文本;
私有列表视图列表视图;
私有ArrayList ArrayList=新ArrayList();
专用阵列适配器;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u聊天室);
databaseReference=FirebaseDatabase.getInstance().getReference();
adapter=new ArrayAdapter(这是android.R.layout.simple\u list\u item\u 1,arrayList);
btnsend=findviewbyd(R.id.sendbutton);
editText=findViewById(R.id.typemessage);
listView=findViewById(R.id.listmessages);
btnsend.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
databaseReference.child(“Chat”).child(“Name”).push().setValue(editText.getText().toString());
}
});
databaseReference.addListenerForSingleValueEvent(新的ValueEventListener()){
@凌驾
public void onDataChange(@NonNull DataSnapshot DataSnapshot){
DatabaseReference chatreference=DatabaseReference.child(“聊天”);
chatreference.addListenerForSingleValueEvent(新的ValueEventListener()){
@凌驾
public void onDataChange(@NonNull DataSnapshot DataSnapshot){
试一试{
对于(DataSnapshot快照:DataSnapshot.getChildren()){
字符串chatmsg=snapshot.child(“Name”).getKey();
Toast.makeText(Chatbox.this,“keys”+chatmsg,Toast.LENGTH\u SHORT.show();
arrayList.add(chatmsg);
}
setAdapter(适配器);
}
捕获(例外情况除外)
{
Toast.makeText(Chatbox.this,“Error”+ex.getMessage(),Toast.LENGTH\u SHORT.show();
}
}
@凌驾
已取消的公共void(@NonNull DatabaseError DatabaseError){
}
});
}
@凌驾
已取消的公共void(@NonNull DatabaseError DatabaseError){
}
});

试试这个

FirebaseDatabase.getInstance()
                    .getReference("Chat")
                    .child("Name")
                    .addListenerForSingleValueEvent(new ValueEventListener() {
                        @Override
                        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                            List<String> chatMessages = new ArrayList<>();
                            for (DataSnapshot dataSnapshot1 : dataSnapshot.getChildren()) {
                                try {
                                    String chatMessage = String.valueOf(dataSnapshot.child(dataSnapshot1.getKey()).getValue());
                                    chatMessages.add(chatMessage);
                                } catch (DatabaseException e) {
                                    e.printStackTrace();
                                }
                            }
                        }

                        @Override
                        public void onCancelled(@NonNull DatabaseError databaseError) {
                            callback.onFailure(null);
                        }
                    });
FirebaseDatabase.getInstance()
.getReference(“聊天”)
.儿童(“姓名”)
.addListenerForSingleValueEvent(新的ValueEventListener(){
@凌驾
public void onDataChange(@NonNull DataSnapshot DataSnapshot){
List chatMessages=new ArrayList();
对于(DataSnapshot dataSnapshot1:DataSnapshot.getChildren()){
试一试{
String chatMessage=String.valueOf(dataSnapshot.child(dataSnapshot1.getKey()).getValue());
添加(chatMessage);
}捕获(数据库异常){
e、 printStackTrace();
}
}
}
@凌驾
已取消的公共void(@NonNull DatabaseError DatabaseError){
callback.onFailure(null);
}
});

我猜您想要检索的是数据而不是密钥:

databaseReference.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

            DatabaseReference chatreference=databaseReference.child("Chat");
            chatreference.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

         for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                            String chatmsg = snapshot.child("Name").getValue();
                            Toast.makeText(Chatbox.this, "keys " + chatmsg, Toast.LENGTH_SHORT).show();
                            arrayList.add(chatmsg);
                        }


                }

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

                }
            });

        }

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

        }
    });

或者希望同时将键和值存储在数组列表中?

您正在使用以下命令将消息添加到数据库中:

databaseReference.child("Chat").child("Name")
这意味着您还必须从同一路径读取消息:

databaseReference.child("Chat").child("Name").addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
            String chatmsg = snapshot.getValue(String.class);
            arrayList.add(chatmsg);
        }
        listView.setAdapter(adapter);
    }
    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        throw databaseError.toException()l
    }
});
这些变化:

  • 在将消息添加到同一节点时,请侦听该节点
  • 删除了嵌套的侦听器,这是不需要的
  • 从每个子快照中获取值,而不是尝试读取不存在的
    Name
    属性
  • 删除了
    try…catch
    ,因为默认行为是将消息写入logcat,这比在toast中显示消息更有用
  • 已实现的
    onCancelled
    ,因为您永远不应该忽略错误

请发布snapshot.child(“Name”).getKey()的日志
您是数据库结构。问题是什么?如何在注释中添加图片…我无法附加DB pictureAlex,我想为我的应用程序创建聊天页面。当用户输入他的消息时,它将存储在firebase数据库中,但我无法在listview中显示相同的内容。Ashish,我已在说明中添加了DB image。示例ase检查和帮助