想使用比较器按时间戳对 ArrayList 中的聊天进行排序,但它不起作用,我不知道为什么

Want to order chats in ArrayList by timestamp using Comparator, but it's not working and I don't know why

我在我的应用程序中实现了一个聊天功能,它运行良好,唯一的问题是现在我希望聊天按 timestamp 排序,这样最新的排在最前面,最旧的排在最后.我试过使用 Comparator 这样做,但由于某种原因它不起作用,我不确定如何修复它。

下面是我的 MessageActivity,我将聊天记录保存到 Firebase,我的 ChatFragment 包含聊天记录 ArrayList。聊天记录出现在那里,但我无法通过任何方式让它们重新排列并按时间戳排序。

有人介意告诉我如何解决这个问题吗?

ChatFragment

public class ChatsFragment extends Fragment {

    private RecyclerView mRecyclerView;
    private UserAdapterChat mUserAdapterChat;
    private List<User> mUsers;
    private List<Chatlist> mChatList;
    private FirebaseUser mFirebaseUser;
    private TextView mNoMessages;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_chats, container, false);

        mFirebaseUser = FirebaseAuth.getInstance().getCurrentUser();
        mNoMessages = v.findViewById(R.id.no_messages);

        mRecyclerView = v.findViewById(R.id.recycler_view);
        mRecyclerView.setHasFixedSize(true);
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getContext());
        mRecyclerView.setLayoutManager(linearLayoutManager);

        mChatList = new ArrayList<>();
        mUserAdapterChat = new UserAdapterChat(getContext(), mUsers, false);
        mRecyclerView.setAdapter(mUserAdapterChat);

        mUsers = new ArrayList<>();

        EditText search_users = v.findViewById(R.id.search_bar);
        search_users.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                searchUsers(s.toString().toLowerCase());
            }

            @Override
            public void afterTextChanged(Editable s) {

            }
        });

        DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Chatlist").child(mFirebaseUser.getUid());
        reference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                Log.d("CHAT", dataSnapshot.toString());
                mChatList.clear();
                for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                    Chatlist chatlist = snapshot.getValue(Chatlist.class);
                    mChatList.add(chatlist);
                }

                if (mChatList.size() == 0) {
                    mNoMessages.setVisibility(View.VISIBLE);
                } else {
                    mNoMessages.setVisibility(View.GONE);
                    chatList();
                }
            }

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

            }
        });

        Task<InstanceIdResult> task = FirebaseInstanceId.getInstance().getInstanceId();
        task.addOnCompleteListener(task1 -> {
            if (task1.isSuccessful()) {
                String token = task1.getResult().getToken();
                updateToken(token);
            } else {
                Exception exception = task1.getException();
                Log.d("TOKEN", exception.getMessage());
            }
        });

        return v;
    }

    private void updateToken(String token) {
        DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Tokens");
        Token token1 = new Token(token);
        reference.child(mFirebaseUser.getUid()).setValue(token1);
    }

    private void searchUsers(String s) {
        Query query = FirebaseDatabase.getInstance().getReference("Users").orderByChild("username").startAt(s).endAt(s + "\uf8ff");
        query.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                mUsers.clear();
                for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                    User user = snapshot.getValue(User.class);
                    if (s.length() == 0) {
                        mUsers.clear();
                    } else {
                        if (user != null) {
                            if (!user.getId().equals(mFirebaseUser.getUid())) {
                                mUsers.add(user);
                                mNoMessages.setVisibility(View.GONE);
                            }
                        }
                    }
                }

                mUserAdapterChat = new UserAdapterChat(getContext(), mUsers, false);
                mUserAdapterChat.notifyDataSetChanged();
                mRecyclerView.setAdapter(mUserAdapterChat);
            }

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

            }
        });
    }

    private void chatList() {
        mUsers = new ArrayList<>(mChatList.size());
        DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Users");
        reference.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                mUsers.clear();
                Collections.sort(mChatList, ChatsFragment.this::compare);
                for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                    User user = snapshot.getValue(User.class);
                    for (int i = 0; i < mChatList.size(); i++) {
                        if (mFirebaseUser != null && user != null) {
                            if (!user.getId().equals(mFirebaseUser.getUid()) && user.getId().equals(mChatList.get(i).receiver)) {
                                ensureSize((ArrayList<?>) mUsers, mChatList.size());
                                mUsers.set(i, user);
                            }
                        }
                    }
                }

                mUserAdapterChat = new UserAdapterChat(getContext(), mUsers, true);
                mUserAdapterChat.notifyDataSetChanged();
                mRecyclerView.setAdapter(mUserAdapterChat);
            }

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

            }
        });
    }

    public static void ensureSize(ArrayList<?> list, int size) {
        list.ensureCapacity(size);
        while (list.size() < size) {
            list.add(null);
        }
    }

    public int compare(Chatlist o1, Chatlist o2) {
        return o1.getTimestamp() < o2.getTimestamp() ? 1 : (o1.getTimestamp() == o2.getTimestamp() ? 0 : -1);
    }
}





        
    

您可以简单地使用 Java8 功能来比较元素,如下所示:

List<ChatList> unique = list.stream().collect(collectingAndThen(toCollection(() -> new TreeSet<>(comparing(ChatList::getTimestamp))),ArrayList::new));
unique.forEach((k) -> System.out.println(k.getTimestamp()));

您正在使用 Long.compare() 对集合进行升序排序。 要显示最新聊天,您需要将比较方法更改为

public int compare(Chatlist o1, Chatlist o2) {
                    return o1.getTimestamp() < o2.getTimestamp() ? 1 : 
                   (o1.getTimestamp == o2.getTimestamp() ? 0 : -1);
}