Полученные данные из firebase не отображаются в alertDialog

Я пытаюсь получить данные (имя преподавателя) из базы данных. Полученные данные не отображаются в диалоговом окне, но отображаются в тосте.

Вот код:

list = new ArrayList<>();
DatabaseReference reference = FirebaseDatabase.getInstance().getReference().child("FacultyMember");
reference.addValueEventListener(new ValueEventListener()
{
    @Override
    public void onDataChange(DataSnapshot dataSnapshot)
    {
        for (DataSnapshot ds : dataSnapshot.getChildren())
        {
            String Name = ds.child("Name").getValue().toString();
            list.add(Name);
            Toast.makeText(getApplicationContext(),Name,Toast.LENGTH_LONG).show();
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});
AlertDialog.Builder builder =new AlertDialog.Builder(AdminHome.this);
builder.setTitle("Member List");
builder.setIcon(R.drawable.ic_format_list_bulleted_black_24dp);
builder.setItems(list.toArray(new String[0]), new DialogInterface.OnClickListener()
{
    @Override
    public void onClick(DialogInterface dialogInterface, int i)
    {

    }
});

Полученные данные из firebase не отображаются в alertDialog

0
0
452
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я думаю, это из-за того, что reference.addValueEventListener запускается после создания alertDialog. потому что addValueEventListener запускается только после того, как произошел addValueEvent, поэтому в вашем коде пустой список был передан в ваш alertDialog, а затем отображается, после этого данные были извлечены и reference.addValueEventListener был запущен. вы должны создать alertDialog после получения всех ваших данных, а не раньше.

например, вы должны знать количество ваших результатов и подсчитывать полученные данные в методе onDataChange, и просто показывать alertDialog, когда количество fetchData достигает исключенного количества.

list = new ArrayList<>();
int execptedResult = NUMBER_OF_RESULT; // <--- you must fetch data from firebase in some way, it depends on your implementation 
int fetchCount = 0;
DatabaseReference reference = FirebaseDatabase.getInstance().getReference().child("FacultyMember");
reference.addValueEventListener(new ValueEventListener()
{
    @Override
    public void onDataChange(DataSnapshot dataSnapshot)
    {
        for (DataSnapshot ds : dataSnapshot.getChildren())
        {
            fetchCount++;
            String Name = ds.child("Name").getValue().toString();
            list.add(Name);
            Toast.makeText(getApplicationContext(),Name,Toast.LENGTH_LONG).show();
            if (fetchCount == execptedResult){
                AlertDialog.Builder builder =new AlertDialog.Builder(AdminHome.this);
                builder.setTitle("Member List");
                builder.setIcon(R.drawable.ic_format_list_bulleted_black_24dp);
                builder.setItems(list.toArray(new String[0]), new 
                    DialogInterface.OnClickListener()
                    {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i)
                        {

                        }
                    });
            }
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});

попробуйте заменить это

builder.setItems(list.toArray(new String[0]), new DialogInterface.OnClickListener()

с использованием

builder.setItems(list.toArray(new String[list.size()]), new DialogInterface.OnClickListener())

Другие вопросы по теме