Проблема изменения данных во вложенных слушателях в Firebase - PullRequest
0 голосов
/ 17 марта 2019

Я работаю с базой данных Firebase в реальном времени. У меня есть список друзей для каждого пользователя. Я добавляю список друзей пользователя в список пользователей. Там нет ошибки, я могу видеть список друзей. Но если я что-то изменю в информации о друзьях пользователя, в адаптере ничего не изменится. Если я добавлю нового пользователя в список друзей, адаптер обнаружит изменения. Я использую вложенный слушатель Firebase. Первый слушатель для получения идентификаторов друзей пользователя, второй слушатель для получения информации о друзьях с использованием идентификаторов.

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

Это мое дерево JSON: json tree

Это мой код для получения списка друзей:

        databaseReference.child("users").child(user_id).child("friends").addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                //friends.clear();
                //friendInfoList.clear();
            //Toast.makeText(FriendsActivity.this, dataSnapshot.toString(), Toast.LENGTH_SHORT).show();
                for(DataSnapshot ds:dataSnapshot.getChildren()){
                    String friend_id=ds.getValue(String.class);
                    friends.add(new Friends(friend_id));
                    Toast.makeText(FriendsActivity.this, friend_id, Toast.LENGTH_SHORT).show();

                    databaseReference.child("users").child(friend_id).addValueEventListener(new ValueEventListener() {
                        @Override
                        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                            //friendInfoList.clear();
                                Users user=dataSnapshot.getValue(Users.class);
                                friendInfoList.add(new FriendInfo(user.getUsername(),user.getCountry(),user.isStatus()));
                        }

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

                        }
                    });

                }

           adapter=new FriendListRecyclerAdapter(FriendsActivity.this,friendInfoList);
            recyclerView.setAdapter(adapter);


        }

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

        }
    });

Ответы [ 2 ]

1 голос
/ 18 марта 2019

Возможно, вы не запускаете узел "users / user_id / friends", когда информация о друзьях была изменена.Также я думаю, что вы должны использовать «дочерний приемник событий».

1 голос
/ 17 марта 2019

Для обновления данных в адаптере вызовите метод notifyDataSetChanged().

Из документов:

notifyDataSetChanged

Уведомляет прикрепленных наблюдателей о том, что базовые данные были изменены, и любое представление, отражающее набор данных, должно само обновиться.

...