当前位置: 首页 > 知识库问答 >
问题:

从FirebaseDatabase获取的数据将显示在3个单独的警报对话框中,而不是一个

丁嘉
2023-03-14

我从Firebase数据库获取一些数据,然后将它们放入数组中,然后尝试在自定义AlertDialog中的List中显示它们。

以下是代码:

query = mDatabase.child("child").child(anotherChild).child("yetAnotherChild");

uProfile.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        query.orderByChild("someChild").addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                if (dataSnapshot != null) {

                    Map<String, String> newD = (Map<String, String>) dataSnapshot.getValue();

                    ArrayList<String> l = new ArrayList<String>();
                    l.add(newD.get("lol").substring(30));

                    String names[] = l.toArray(new String[0]);

                    AlertDialog.Builder alertDialog = new AlertDialog.Builder(Activity.this);
                    LayoutInflater inflater = getLayoutInflater();
                    View convertView = inflater.inflate(R.layout.dialog_list, null);
                    alertDialog.setView(convertView);
                    alertDialog.setTitle("title");
                    ListView lv = (ListView) convertView.findViewById(R.id.lv);
                    ArrayAdapter<String> adapter = new ArrayAdapter<String>(getBaseContext(), android.R.layout.simple_list_item_1, names);
                    lv.setAdapter(adapter);

                    alertDialog.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {

                        }
                    });

                    alertDialog.show();
                } else {
                    Toast.makeText(getBaseContext(), "NULLLLL", Toast.LENGTH_SHORT).show();
                }
            }

            ...
            ...
        });

    }
});

以下是数据库结构:

app
 -child
   -anotherChild
     -yetAnotherChild
       -inaccessibleChild
         -someChild: "value"
         -lol: "value"

我不能在这里使用value eEventListener(),因为我无法访问inaccsibleChild。这里的inaccsibleChild是跟踪特定用户的其他用户的uid。我如何访问那里的uid

问题是数据被获取,但不是在一个AlertDialog列表中显示,而是在3个单独的AlertDialog中逐一显示。

这里出了什么问题?

请告诉我。

共有3个答案

海雪松
2023-03-14

在调用之前创建并显示AlertDialog。addChildEventListener()

下载适当的数据后,使用addChildEventListener调用notifyDatasetChanged()。不要在addChildEventListener中创建AlertDialog

慕容安易
2023-03-14

使用valueEventListeneraddChildEventListener时设置限制。这样地,

int limit = 100;
databaseRef.child("chats").limitToLast(limit).addValueEventListener(listener);

当您完成与Firebase相关的工作时,请始终删除侦听器。像这样,

databaseRef.child("chats").limitToLast(limit).removeEventListener(listener);

谢谢

刁星渊
2023-03-14

Firebase事务是异步的,所以添加3个子项的初始行发生在设置侦听器之后,因此回调被调用3次。(制作3个对话)。

将此行移到单击时的外部:

 query = mDatabase.child("child").child(anotherChild).child("yetAnotherChild");

然后,当您添加下面的侦听器(在on click中)时,应该可以了

query.orderByChild("someChild").addChildEventListener(new ChildEventListener() {
                    @Override
                    public void onChildAdded(DataSnapshot dataSnapshot, String s) {
 类似资料:
  • 在我的应用程序中,当我试图显示自定义的框时,它在android手机中运行良好。现在,当我在android选项卡上安装应用程序时,一切都很好,只有自定义框有问题。不显示。所以我想,我应该检查正常对话框,它工作正常。下面是普通对话框和警报对话框的代码。

  • 我使用的是sequelize ORM,而对于DB我使用的是MySQL,在其中我关联了两个表并获得了数据,但我希望第二个数据(另一个表的数据)不应该像嵌套对象一样进来,而是我们可以在一个对象中显示所有数据(两个表的数据)。 让我展示一下屏幕快照。 我想要的东西。 忽略数据的键和值,但我的问题是,我们是否可以在同一对象中显示另一个表的数据(像inner join一样),而不是像嵌套对象中的数据。 任何

  • 在Android应用程序中,我想在AlertDialog中显示自定义列表视图。 我该怎么做呢?

  • 如何在java摆中从第二个JFrame获取数据?我有一个带有JLabel和JButton的帧。单击JButton时,它会打开另一个带有自定义日历的帧。我想选择日期(通过JButton)并将日期放在主JFrame的JLabel中。我不想创建第一帧的新实例,因为还有其他用户可能键入的我不想删除的信息。

  • 我在antoher的项目中有完全相同的代码,但它在这里继续崩溃。我有。我真的不确定问题出在哪里。我尝试过切换gradle版本,从切换到。不管怎样,一切都失败了

  • 我有一个上下文菜单,它包含一个带有一些控件的CustomMenuItem。单击按钮时,会自动显示对话框和隐藏上下文菜单。问题是:我想在对话框显示时阻止关闭上下文菜单。我该如何解决这个问题呢? 我已经追踪到这件事了。当对话框打开时,将触发一个FocusUngrabEvent.Focus_Ungrab事件,该事件在PopupWindow中处理。我已经尝试在FocusUngrabEvent.Focus_