Слушатель событий для одного события, вызывающего одно и то же значение несколько раз - PullRequest
0 голосов
/ 19 апреля 2020

Я использую ссылку на один узел для получения данных от другого узла в базе данных Firebase Realtime. Сначала я получаю размер пользователей с текущим Uid пользователя в узле чата, затем вызываю эти идентификаторы из узла пользователей и печатаю их на На мой взгляд, что я получаю, даже если я получаю правильный размер, но идентификаторы добавляются несколько раз.

Структура базы данных

enter image description here

Logcat

2020-04-19 14:25:31.411 12076-12076/com.shivam.chatapp2 D/Tag2: Size for each  loop   1
2020-04-19 14:25:31.411 12076-12076/com.shivam.chatapp2 D/Tag2: Size for each  loop   2
2020-04-19 14:25:31.412 12076-12076/com.shivam.chatapp2 D/Tag2: User List Ids :  KRhmaWXCctMHbU1Z6NAWRGGw2ag2
2020-04-19 14:25:31.417 12076-12076/com.shivam.chatapp2 D/Tag2: User List Ids :  n9KF5J5wuzSj4npgO8p16b7cOIV2
2020-04-19 14:25:31.419 12076-12076/com.shivam.chatapp2 D/Tag2: User List Ids :  KRhmaWXCctMHbU1Z6NAWRGGw2ag2
2020-04-19 14:25:31.422 12076-12076/com.shivam.chatapp2 D/Tag2: User List Ids :  n9KF5J5wuzSj4npgO8p16b7cOIV2
2020-04-19 14:25:31.678 12076-12076/com.shivam.chatapp2 D/Tag2: Name called  Shivam
2020-04-19 14:25:31.683 12076-12076/com.shivam.chatapp2 D/Tag2: Name called  Shivam
2020-04-19 14:25:31.694 12076-12076/com.shivam.chatapp2 D/Tag2: Name called  Harshita
2020-04-19 14:25:31.695 12076-12076/com.shivam.chatapp2 D/Tag2: Name called  Harshita

Код

 private void chatlist_loop(){
    mUsers.clear();

    mUserAdapter = new UserAdapter(getContext(), mUsers, false);
    recyclerView.setAdapter(mUserAdapter);
    mUserAdapter.notifyDataSetChanged();

    String fuser;
    fuser = FirebaseAuth.getInstance().getCurrentUser().getUid();
    rootRef = FirebaseDatabase.getInstance().getReference();
    ChatlistRef = rootRef.child("Chatlist").child(fuser);

    mValueEventListener=new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

            for (DataSnapshot ds : dataSnapshot.getChildren()) {
                String userIDS = ds.getKey();

                UserChatList.add(userIDS);
                Log.d(TAG,"Size for each  loop   "+UserChatList.size());
            }

            UserListSize=UserChatList.size();
            for (int i =1;i<=UserListSize;i++) {
                for (String usereReference:UserChatList) {
                    Log.d(TAG,"User List Ids :  " +usereReference);
                    DatabaseReference UserRef= FirebaseDatabase.getInstance().getReference("Users").child(usereReference);

                    ValueEventListener eventListener = new ValueEventListener() {
                        @Override
                        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                            User user = dataSnapshot.getValue(User.class);
                            mUsers.add(user);
                            mUserAdapter.notifyDataSetChanged();
                            String name = dataSnapshot.child("First").getValue(String.class);
                            Log.d(TAG, "Name called  "+name);

                        }

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

                        }
                    };
                    UserRef.addListenerForSingleValueEvent(eventListener);

                }
            }

        }

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

        }
    };
    ChatlistRef.addListenerForSingleValueEvent(mValueEventListener);

1 Ответ

1 голос
/ 19 апреля 2020

Вы делаете для каждого l oop для каждой итерации регулярного числа для l oop, поэтому вы добавляете несколько значений, попробуйте следующее:

...........
...........

mValueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {

//loop through every user id in the fuser node      
for (DataSnapshot ds : dataSnapshot.getChildren()) {

//grab the id
String userID = ds.getKey();

//start a new call to users to grab details
DatabaseReference UserRef= FirebaseDatabase.getInstance().getReference("Users").child(userID);


UserRef.addListenerForSingleValueEvent(new ValueEventListener() {

@Override
public void onDataChange(DataSnapshot dataSnapshot) {

//fill the list with the needed users  
User user = dataSnapshot.getValue(User.class); 
mUsers.add(user);
mUserAdapter.notifyDataSetChanged();


}

@Override
public void onCancelled(DatabaseError databaseError) {

Log.w(TAG, "loadPost:onCancelled", databaseError.toException());

}



});



}

//finish loop


}

@Override
public void onCancelled(DatabaseError databaseError) {

Log.w(TAG, "loadPost:onCancelled", databaseError.toException());
        // ...
}
};
ChatlistRef.addValueEventListener(mValueEventListener);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...