Как упорядочить данные в Recyclerview по дате из Firebase - PullRequest
0 голосов
/ 07 мая 2020

Я пытаюсь создать приложение для обмена сообщениями, и оно работает нормально, но я хочу внести некоторые изменения, вместо того, чтобы видеть пользователей в отношении их имени. Я хочу видеть пользователей в отношении последнего сообщения. В настоящее время, когда я получаю новое сообщение, оно не появляется в списке, а остается в recyclerview в той же позиции, что я хочу, это видеть пользователя сверху, которому я отправил или получил последнее сообщение. У меня есть отметка времени с каждым сообщением, которое отправлено пользователем

Структура сообщений

enter image description here

RecyclerAdapter

    public class ChatsFragmentAdapter extends RecyclerView.Adapter<ChatsFragmentAdapter.ViewHolder2> {

    private Context mContext;
    private List<User> mUsers;

    String theLastMessage;
    String TAG = "AdTag";

    public ChatsFragmentAdapter(Context mContext, List<User> mUsers) {
        this.mContext = mContext;
        this.mUsers = mUsers;
    }

    @NonNull
    @Override
    public ChatsFragmentAdapter.ViewHolder2 onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view= LayoutInflater.from(mContext).inflate(R.layout.user_item,parent,false);

        return new ChatsFragmentAdapter.ViewHolder2(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ChatsFragmentAdapter.ViewHolder2 holder, int position) {

        final User user=mUsers.get(position);
        lastMessage(user.getId(), holder.last_msg);


       }

    @Override
    public int getItemCount() {
        return  mUsers.size();
    }

    public class ViewHolder2 extends RecyclerView.ViewHolder{

        public TextView username;
        public ImageView profile_image;
        private ImageView img_on;
        private ImageView img_off;
        private  TextView last_msg;

        public ViewHolder2(@NonNull View itemView) {
            super(itemView);

            username=itemView.findViewById(R.id.username);
            profile_image=itemView.findViewById(R.id.profile_image);
            img_on = itemView.findViewById(R.id.img_on);
            img_off = itemView.findViewById(R.id.img_off);
            last_msg=itemView.findViewById(R.id.last_msg);


        }
    }

    private void lastMessage(final String userid, final TextView last_msg) {

        theLastMessage = "default";

        final FirebaseUser firebaseUser = FirebaseAuth.getInstance().getCurrentUser();

        String fuserkey;

        fuserkey = FirebaseAuth.getInstance().getCurrentUser().getUid();

        int i = (fuserkey).compareTo(userid);
        if (+i >= 1) {
            ChatKey = userid + fuserkey;

        } else if (+i < 1) {
            ChatKey = fuserkey + userid;
        } else if (+i == 0) {
            ChatKey = "";
        }

        if (ChatKey !=null) {

            DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Chats").child(ChatKey);
            reference.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                    for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                        Chat chat = snapshot.getValue(Chat.class);
                        if (firebaseUser != null && chat != null) {
                            if (chat.getReceiver().equals(firebaseUser.getUid()) && chat.getSender().equals(userid) ||
                                    chat.getReceiver().equals(userid) && chat.getSender().equals(firebaseUser.getUid())) {
                                theLastMessage = chat.getMessage();
                                if (!chat.isIsseen()) {
                                    last_msg.setTypeface(Typeface.DEFAULT_BOLD);
                                }
                            }
                        }
                    }

                    switch (theLastMessage) {
                        case "default":
                            last_msg.setText("No Message");
                            break;

                        default:
                            last_msg.setText(theLastMessage);
                            break;
                    }

                    theLastMessage = "default";

                    Log.d(TAG, "Last Message : " + theLastMessage);

                }

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

                }
            });

        }



    }
}

1 Ответ

1 голос
/ 07 мая 2020

Согласно документации Firebase , вам нужно будет отсортировать его, когда вы получите ссылку на экземпляр.

В настоящее время у вас есть это:

FirebaseDatabase.getInstance().getReference("Chats").child(ChatKey);

You нужно изменить на что-то вроде этого:

FirebaseDatabase.getInstance().getReference("Chats").child(ChatKey).orderByKey("timestamp");

Но я думаю, что для его использования вам придется изменить свою структуру или добавить ключи.

Здесь это объяснение того, как работают методы сортировки.

...