【问题标题】:Chat messages saved in firebase database but not able to view in listview聊天消息保存在 firebase 数据库中,但无法在 listview 中查看
【发布时间】:2019-07-15 10:47:04
【问题描述】:

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

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) {

            }
        });

【问题讨论】:

  • 请贴出snapshot.child("Name").getKey();的日志,你的数据库结构。
  • 有什么问题?
  • 如何在评论中添加图片....我无法附加数据库图片
  • Alex,我想为我的应用程序创建聊天页面。当用户输入他的消息时,它将存储在 firebase 数据库中,但我无法在 listview 中显示相同的内容。
  • Ashish,我在描述中添加了数据库图像。请检查并帮助

标签: java android firebase listview firebase-realtime-database


【解决方案1】:

试试这个

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);
                        }
                    });

【讨论】:

    【解决方案2】:

    我猜你想检索数据而不是关键:

    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) {
    
            }
        });
    

    或者希望您将两者存储在一个数组列表键和值中?

    【讨论】:

      【解决方案3】:

      您正在将消息添加到数据库中:

      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,因为您永远不应忽略错误。

      【讨论】:

        猜你喜欢
        • 2019-07-09
        • 2018-03-19
        • 1970-01-01
        • 2012-08-30
        • 2018-09-30
        • 2017-02-12
        • 1970-01-01
        • 2013-03-04
        • 2017-11-02
        相关资源
        最近更新 更多