Как получить строковые значения из запроса внутри для l oop, используемого для addValueEventListener - PullRequest
0 голосов
/ 29 февраля 2020

Итак, внутри моего для l oop Я получаю значения из одного пути, а затем в запросе использую creatorUid из первого для l oop, чтобы получить другие строки из другого пути. Мне нужно найти способ получить эти строки и добавить их в массив, расположенный в первом для l oop, но не для вложенного для l oop. Если вам нужно уточнить, о чем я говорю, у меня есть комментарии в коде ниже:

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

            chatsItemArrayList.clear();

            for (DataSnapshot ds : dataSnapshot.getChildren()) {
                title = "" + ds.child("title").getValue();
                description = "" + ds.child("description").getValue();
                date = "" + ds.child("datecreated").getValue();
                speaks = "" + ds.child("speaks").getValue();
                upvotes = "" + ds.child("upvotes").getValue();
                views = "" + ds.child("views").getValue();
                picture = "" + ds.child("chatpicture").getValue();
                String identifier = "" + ds.child("identifier").getValue();
                creatorUid = "" + ds.child("chatcreatoruid").getValue();

                System.out.println(creatorUid + " THIS IS THE CREATOR UID");


                Query query = FirebaseDatabase.getInstance().getReference().child("Users").orderByKey().equalTo(creatorUid);
                query.addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                        for (DataSnapshot dataSnapshot1 : dataSnapshot.getChildren()) {

                          //HOW DO I GET THESE VALUES FROM HERE:

                            rank = "" + dataSnapshot1.child("rank").getValue();
                            profilePicture = "" + dataSnapshot1.child("image").getValue();
                            username = "" + dataSnapshot1.child("username").getValue();

                            System.out.println("THIS IS THE RANK " + getRankText() + " THE USERNAME " + getUsernameText() + " PROFILEPICTURE " + getProfilePicture());

                        }
                    }

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

                    }
                });

                System.out.println("R1" + getRankText() + " U1" + getUsernameText() + " P1 " + getProfilePicture());

                 // TO HERE:

                chatsItemArrayList.add(new ChatsItem(getProfilePicture(), title, date, speaks, description, getUsernameText(), getRankText(), upvotes, views, picture));

            }

            mAdapter = new ChatsFragmentAdapter(chatsItemArrayList);
            mRecyclerView.setAdapter(mAdapter);
        }

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

        }
    });

1 Ответ

0 голосов
/ 29 февраля 2020

Данные из Firebase доступны только внутри метода onDataChange или в коде, который вызывается оттуда. Для этого нет обходного пути.

Если вам требуется дополнительный вызов базы данных для загрузки дополнительных данных, вам следует:

  • либо приостановить добавление элемента в список сначала, а затем только добавить его во внутренний onDataChange
  • или сначала добавьте неполный элемент в список, а затем обновите его во внутреннем onDataChange

Таким образом, самое простое решение - это выполнить первое, которое выглядит примерно так:

query.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        for (DataSnapshot dataSnapshot1 : dataSnapshot.getChildren()) {
            rank = "" + dataSnapshot1.child("rank").getValue();
            profilePicture = "" + dataSnapshot1.child("image").getValue();
            username = "" + dataSnapshot1.child("username").getValue();

            chatsItemArrayList.add(new ChatsItem(getProfilePicture(), title, date, speaks, description, getUsernameText(), getRankText(), upvotes, views, picture));

        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        throw databaseError.toException();
    }
});

Как правило, вы также хотите обновить sh адаптер в этом внутреннем методе onDataChange, вызвав что-то вроде adapter.notifyDataSetChanged().

Также см. :

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