Как добавить ValueEvent Listener без дублирования данных - PullRequest
1 голос
/ 28 апреля 2020

Я пытаюсь создать приложение чата и показать пользователям, с кем общался текущий пользователь, но когда я использую Listener для Single Event, пользователи добавляются в чаты после того, как пользователи перезапускают его приложение, и когда я использую Value Event Listener, пользователи дублируются в чаты фрагменты в режиме реального времени, но каждый раз, когда другой пользователь возобновляет деятельность.

Мой код

  public class Chats extends Fragment {

    private RecyclerView recyclerView;
    private ChatsFragmentAdapter chatsFragmentAdapter;

    FloatingActionButton profile, credentials;

    DatabaseReference rootRef;
    DatabaseReference ChatlistRef;

    ValueEventListener mValueEventListener;

    private List<User> mUsers;

    String TAG = "Tag2";
    ;

    int UserListSize;

    public Chats() {
        // Required empty public constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_chats, container, false);


        profile = view.findViewById(R.id.fab_edit_profile_pic);
        credentials = view.findViewById(R.id.fab_edit_name);
        FabAction();

        recyclerView = view.findViewById(R.id.recycler_view);
        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));

        //new ItemTouchHelper(simpleCallback).attachToRecyclerView(recyclerView);

        mUsers = new ArrayList<>();

        chatlist_loop();

        return view;
    }

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

        chatsFragmentAdapter = new ChatsFragmentAdapter(getContext(), mUsers);
        recyclerView.setAdapter(chatsFragmentAdapter);
        chatsFragmentAdapter.notifyDataSetChanged();


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


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

                for (DataSnapshot ds : dataSnapshot.getChildren()) {

                    String userID = ds.getKey();

                    DatabaseReference UserRef = FirebaseDatabase.getInstance().getReference("Users").child(userID);
                    Log.d(TAG, " UserRef : " + UserRef);


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

                            User user = dataSnapshot.getValue(User.class);
                            mUsers.add(user);
                            chatsFragmentAdapter.notifyDataSetChanged();

                        }

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

                        }
                    };


                    UserRef.addValueEventListener(eventListener);

                }

            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

                Log.d(TAG, "loadPost:onCancelled", databaseError.toException());
            }
        };
        ChatlistRef.addValueEventListener(mValueEventListener);

    }

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