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

标签 java android comparator

我在我的应用程序中实现了聊天功能,并且工作正常,唯一的问题是现在我希望聊天按时间戳排序,以便最新的先出现,最旧的出现最后的。我已尝试使用比较器执行此操作,但由于某种原因它不起作用,并且我不确定如何修复它。

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

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

enter image description here

聊天 fragment

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);
    }
}





        
    

最佳答案

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

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

关于java - 想要使用比较器按时间戳对 ArrayList 中的聊天进行排序,但它不起作用,我不知道为什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63090111/

相关文章:

android - 是否可以在 iPad/iPhone 设备上运行 .APK/Android 应用程序?

android - 查询是否返回空游标

java - 访问数组列表中的元素时出错

java - 根据日期属性(字符串类型)对对象列表进行排序时出现异常

java - for循环无限运行

Java并行多个任务超时

android - SMS BroadCast Receiver 接收了多少次?

java - 异常: java. lang.OutOfMemoryError,无法创建新的 native 线程

java - 删除文本末尾的空行

java - 将比较器组合成一个类