Извлеченные данные из базы данных не отображаются на alertDialog - PullRequest
0 голосов
/ 27 октября 2018

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

Вот код:

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

    }
});

Screenshot of the output

Ответы [ 2 ]

0 голосов
/ 27 октября 2018

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

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

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

builder.setItems(list.toArray(new String[list.size()]), new DialogInterface.OnClickListener())
0 голосов
/ 27 октября 2018

Я думаю, это из-за того, что 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) {

    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...