SSS
SSS

Reputation: 67

How to make the latest chat above others?

I'm working on a chat app, how can I make the latest chat come above others? Here in the image, the last message received was by Wejdan, but as you can see it is still on the bottom not on the top of other chats.

enter image description here

I saved every message with its timeStamp & isSeen value like below: enter image description here

I know it has something to do with the timeStamp but I don't know how to implement it. Here is my code for sending a message:

private void sendMessage (final String sender, final String receiver, String message){
        final String timeStamp = String.valueOf(System.currentTimeMillis());
        DatabaseReference reference = FirebaseDatabase.getInstance().getReference();
        HashMap<String, Object> hashMap = new HashMap<>();
        hashMap.put("sender", sender);
        hashMap.put("receiver", receiver);
        hashMap.put("message", message);
        hashMap.put("isseen", false);
        hashMap.put("time", timeStamp);
        reference.child("Chats").push().setValue(hashMap);
        final DatabaseReference chatRef = FirebaseDatabase.getInstance().getReference("Chatlist")
                .child(fUser.getUid()).child(userid);
        chatRef.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                if(!snapshot.exists()){
                    chatRef.child("id").setValue(userid);
                }
            }
            @Override
            public void onCancelled(@NonNull DatabaseError error) {
            }
        });
        final DatabaseReference chatRef1 = FirebaseDatabase.getInstance().getReference("Chatlist")
                .child(receiver).child(fUser.getUid());
        chatRef1.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                if(!dataSnapshot.exists())
                {
                    chatRef1.child("id").setValue(fUser.getUid());
                }
            }
            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
            }

        });

and this code for determine what messages are unread:

 reference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                //fix
                if (!isAdded()) return;
                ViewPagerAdapter viewPagerAdapter = new ViewPagerAdapter(getChildFragmentManager());
                int unread = 0;
                for (DataSnapshot snapshot1 : snapshot.getChildren()){
                    Chat chat = snapshot1.getValue(Chat.class);
                    if(chat.getReceiver().equals(firebaseUser.getUid()) && !chat.isIsseen()){
                        unread++;
                    }
                }
                if(unread == 0 ){
                    viewPagerAdapter.addFragment(new ChatsFragment() , "Chats");
                    
                }else {
                    viewPagerAdapter.addFragment(new ChatsFragment() , "("+unread+") Chats");
             
                }
                viewPagerAdapter.addFragment(new UsersFragment(), "Users");
                viewPager.setAdapter(viewPagerAdapter);
                tabLayout.setupWithViewPager(viewPager);
            }
            @Override
            public void onCancelled(@NonNull DatabaseError error) {
            }
        });

this is a snippet of my ChatFragment (where I have all the chats):

private List<Chatlist> usersList;
    recyclerView.setHasFixedSize(true);
       recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
       recyclerView.hideIfEmpty(recyclerView);
       recyclerView.showIfEmpty(mEmptyView);
       fuser = FirebaseAuth.getInstance().getCurrentUser();
       usersList = new ArrayList<>();
       reference = FirebaseDatabase.getInstance().getReference("Chatlist").child(fuser.getUid());
       reference.addValueEventListener(new ValueEventListener() {
           @Override
           public void onDataChange(@NonNull DataSnapshot snapshot) {
                usersList.clear();
                for(DataSnapshot snapshot1 : snapshot.getChildren()){
                    Chatlist chatlist = snapshot1.getValue(Chatlist.class);
                    usersList.add(chatlist);
                }
                chatList();
           }
           @Override
           public void onCancelled(@NonNull DatabaseError error)
           {
           }
       });
 private void chatList() {
        mUsers = new ArrayList<>();
        reference = FirebaseDatabase.getInstance().getReference("Users");
        reference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                mUsers.clear();
                for(DataSnapshot snapshot1 : snapshot.getChildren()){
                    User user = snapshot1.getValue(User.class);
                    for(Chatlist chatlist : usersList){
                        if(user.getId().equals(chatlist.getId())){
                            mUsers.add(user);
                        }
                    }
                }
               usersAdapter = new UsersAdapter(getContext(), mUsers , true);
                recyclerView.setAdapter(usersAdapter);
            }
            @Override
            public void onCancelled(@NonNull DatabaseError error) {
            }
        });

please help.

Upvotes: 0

Views: 97

Answers (1)

Saltae
Saltae

Reputation: 213

you can sort messages from realtime database by doing this:

myRef.orderByChild("timestamp").addChildEventListener(new ChildEventListener{
 /*Note that you need to implement the methods.
   For example: onChildAdded, onChildChanged etc.*/
})

Using ChildEventListener instead of ValueEventListener, will sort the children of every branch of your reference, example:

foo----
      |-branch1---|
      |           |-timestamp: "1234"
      |
      |
      |-branch2---|
                  |-timestamp: "2345"

With DatabaseReference myRef = FirebaseDatabase.getInstance().getReference("foo"); , ChildEventListener, and orderByChild(), like I showed You right before, the query will sort timestamps ordering them!

then if your new message still on the bottom and you want to swap the order, you can use on your RecyclerView:

recyclerView.setStackFromEnd(true)
reciclerView.setReverseLayout(true)

Hope it helps, happy coding! :)

Upvotes: 1

Related Questions